V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  amiwrong123  ›  全部回复第 39 页 / 共 39 页
回复总数  777
1 ... 30  31  32  33  34  35  36  37  38  39  
@bringyou
好吧,现在成功了。谢谢回答啦。
Constructor<?> con = clazz.getDeclaredConstructor(outer.class);
con.setAccessible(true);
Object obj = con.newInstance(ooo);
但这种情况下,我是不是只能用 Object 引用来指向这个实例,因为没法 import 私有内部类,所以也无法用私有内部类类型来声明变量了?
@shily
好吧,原来是我 getDeclaredConstructor 用的不对,谢谢回答啦。
但是,现在就报错:
com.prac.outer$normalInner
Exception in thread "main" java.lang.IllegalAccessException: class test2 cannot access a member of class com.prac.outer$normalInner with modifiers "private"
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:376)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:639)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:490)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at test2.main(test2.java:39)
所以不管是静态内部类还是非静态内部类,只要访问权限是私有,就不可以创建实例了吗
@14m3
哇,你这个链接是个神器,回头好好研究下。确实,这个代码怎么优化的跟环境有关系啊。你这个代码而且写得很清楚,加了构造和析构的打印后,思路瞬间清晰了。
@karia
这本书买了,还没看。的确很多问题别人已经研究过了,所以一般有问题我都是先看网上博客啥的

@lrxiao
你说,写个 destructor 然后看调用次数,这个挺好使啊。我在 32 楼给的链接里看到了调用析构的次数了。
你意思这两段代码都是已经被优化了的呗
@lcdtyph
好吧,懂啦,看来这个编译器选项也挺重要啊。

@ispinfx
我就正在 primer 呢,但看得断断续续,我是因为看到书中某页的一句话“返回的是 sum 的副本”,但没细说,然后就开始想这个问题。
@nethard
也不是喜欢这么写,只是在测试想把各种情况测试一遍,带不带 const,带不带&,这样


@ispinfx
开始这个用法对不对还真拿不准,然后就很疑惑。不过看了 17 楼的文档里写了这种用法。
@lcdtyph
看到啦,在 Temporary object lifetime 的 There are two exceptions from that:,我这个属于 const lvalue reference。

你说的-fno-elide-constructors,这又是我的知识盲区了。。。看了看博客,意思就是会省略一些中间变量的创建,因为两次拷贝和一次拷贝效果是一样的。但为啥你说,我第一种代码里一定会分配两次内存,不是默认是会优化的吗? vs2017 里面好像没有这个选项。。

guaranteed copy elision,又是一个知识点,我拿小本本记上。
@zjsxwc
你们都说,内存会被释放掉。那么我打印 global 的值的时候,肯定就是非法值呗。
class sale {
public:
int i = 1;
};

sale add(const sale& lift, const sale& right) {
sale sum = lift;
sum.i += right.i;
return sum;
}

int main()
{
sale one;
sale two;
const sale& global = add(one, two);
cout << global.i;
}
执行这个代码,我发现还是能打印出来 2 啊,也不是什么非法值。
@ipwx
是啊,你说的差不多。主要把,我是想看看 return 到底是怎么 return 的,有几次内存拷贝,这样。
还有最后你说的这个深度优化,意思懂啦,相当于直接 A target;
@aliwalker
既然你用 clang 编译没有出现两次写内存,那可能我的编译器的问题吧。
然后你的第二段,我看了,它把返回值 int 存在了-12,-11,-10,-9 这四个字节里,然后把地址存在了-8,-7,...,-1,没有什么重合啊感觉。所以没理解,“为什么不是 const 引用不行”。
@thedrwu
好吧,首先是不是,引用绑定到返回的中间变量,这种写法就是错的吗

然后,我又改了一下,改成 sale global = add(one, two);汇编就变成了:
00B019D2 8D 45 E8 lea eax,[two]
00B019D5 50 push eax
00B019D6 8D 4D F4 lea ecx,[one]
00B019D9 51 push ecx
00B019DA E8 F0 F9 FF FF call add (0B013CFh)
00B019DF 83 C4 08 add esp,8
00B019E2 89 85 10 FF FF FF mov dword ptr [ebp-0F0h],eax
00B019E8 8B 95 10 FF FF FF mov edx,dword ptr [ebp-0F0h]
00B019EE 89 55 DC mov dword ptr [global],edx
好像跟是不是对象没关系,只用一个地址就好了。
哎,我是不是有点钻牛角尖了,但是又有点好奇。

@akira
你看上面的汇编,好像跟是不是对象没关系啊。

@hoyixi
哈哈哈,一时手滑啦
@lhx2008
用得是 vs2017,找了找,在当前项目的什么设置里面,找到了“优化”,里面有什么内联函数拓展、启动内部函数什么的,但基本都是关着的。

@ipwx
const int& b = re();原来这种用法是不合法的吗?有点没懂啊,我知道如果返回局部变量的引用,这种情况是不合法的,虽然编译器只是报个 warning。


@stephen9357
原来是这样的啊。确实大概能看明白,比如函数体返回值那里有没有&(返回的是不是引用),会体现到汇编上去。虽然分配了两次空间,但可能就是编译器没优化好呗。
@caocong
```javascript
document.getElementById("source").onfocus = function(){
navigator.clipboard.readText().then(
clipText => {document.getElementById("source").value = clipText;})
setTimeout(()=> {
var a = document.getElementsByClassName('tlid-translation')[0];
var result = ''
//console.log(a.children.length);
for (var i = 0; i < a.children.length; i++){
//console.log(a.children[i].tagName);
if(a.children[i].tagName == 'SPAN' )
{//console.log(a.children[i].innerText);
result += a.children[i].innerText;
}else{
result += '\n';
}
}
navigator.clipboard.writeText(result)},2000);


};
```
原来大括号可以把语句框起来,这样就可以了。这样就解决了左边框有换行的情况。再次感谢啦。
@caocong
刚才我还在想怎么解决,对话,延时就好了。谢谢大佬。
但如果左边框有换行符,有边框 tlid-translation 里面的 children 不止一个,类似于:
<span title="" class="">遷移 Transition to the Audio </span>
<br>
<span title="" class="">遷移 Transition to the Audio </span>
这个好像不好弄,看语法好像没法写循环啊
@caocong
我在看一下,能不能把粘贴板的内容,替换为谷歌翻译的右边框的内容(翻译后的内容)。
@caocong
谢谢,好使了。但好使粘贴板里的内容如果是日文,好像有编码问题。我再百度百度吧。代码就是
```javascript
document.getElementById("source").onfocus = function(){
navigator.clipboard.readText().then(
clipText => {document.getElementById("source").value = clipText;})
}
```
还是说,我得在火狐的配置文件里面改什么吗? about:config 里面的 clipboard.autocopy 已经被我改成 true 了,但还是不好使。
1 ... 30  31  32  33  34  35  36  37  38  39  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2859 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 16ms · UTC 00:16 · PVG 08:16 · LAX 16:16 · JFK 19:16
Developed with CodeLauncher
♥ Do have faith in what you're doing.