我也发几个小问题。

时间:2021-12-01 17:35:15
1.
class Test
{
};

Test* pTest = new Test();
会不会调用所谓的构造函数,如果我没有声明一个构造函数。
或者说是否存在call 指令。


:答案看我blog。

2.
const int i = 5;
int* c = const_cast<int*>(&i);
*c = 6;
cout<<i;
输出多少? 为什么?


13 个解决方案

#1


http://healerkx.spaces.live.com/

#2


骗人。blog上没有。

#3


5

#4


6
i is no longer a const type
c point to the address of a

#5


第一题,如果没提供的话,不调用
如果提供的话就调用.
第二题,改变了,他复制了另一个内存区,改变了这个内存,但愿i不变

#6


……来占个位子撒泡尿
其实甘草是来骗BLOG点击率的,大家不要给他骗了~

#7


1. 明显不写不会,自己写了明显会!
不写call也没有
2. 常量折叠?
const int i = 5; //常量分配了内存(和变量很像),只是你想用i=6这样编译器会耍流氓
int* c = const_cast <int* >(&i); //你耍流氓强转
*c = 6; //可以,常量地址里面的内容被改了
cout<<i; //哈哈,编译器说我早就学会优化了,既然说了是常量我就不用取地址里面的内容了,就是5了~

#8


5
编译器才不像4楼这么傻呢

#9


不是有call的吗

Test* pTest = new Test();
004132CE  mov         dword ptr [ebp-0E0h],1 
004132D8  mov         eax,dword ptr [ebp-0E0h] 
004132DE  push        eax  
004132DF   call        operator new (411203h) 
004132E4  add         esp,4 
004132E7  mov         dword ptr [ebp-0D4h],eax 
004132ED  cmp         dword ptr [ebp-0D4h],0 
004132F4  je          main+6Ch (41331Ch) 
004132F6  mov         ecx,dword ptr [ebp-0E0h] 
004132FC  push        ecx  
004132FD  push        0    
004132FF  mov         edx,dword ptr [ebp-0D4h] 
00413305  push        edx  
00413306   call        @ILT+505(_memset) (4111FEh) 
0041330B  add         esp,0Ch 
0041330E  mov         eax,dword ptr [ebp-0D4h] 
00413314  mov         dword ptr [ebp-0E8h],eax 
0041331A  jmp         main+76h (413326h) 
0041331C  mov         dword ptr [ebp-0E8h],0 
00413326  mov         ecx,dword ptr [ebp-0E8h] 
0041332C  mov         dword ptr [pTest],ecx 

#10


插一句,第2题结果未定义,以前碰到这个问题的时候查过标准了,哈哈

#11


谁说这个call了。。。 。。。

#12


1 不CALL
2 哈哈,编译器说我早就学会优化了,既然说了是常量我就不用取地址里面的内容了,就是5了~ 

#13


同意ls

#1


http://healerkx.spaces.live.com/

#2


骗人。blog上没有。

#3


5

#4


6
i is no longer a const type
c point to the address of a

#5


第一题,如果没提供的话,不调用
如果提供的话就调用.
第二题,改变了,他复制了另一个内存区,改变了这个内存,但愿i不变

#6


……来占个位子撒泡尿
其实甘草是来骗BLOG点击率的,大家不要给他骗了~

#7


1. 明显不写不会,自己写了明显会!
不写call也没有
2. 常量折叠?
const int i = 5; //常量分配了内存(和变量很像),只是你想用i=6这样编译器会耍流氓
int* c = const_cast <int* >(&i); //你耍流氓强转
*c = 6; //可以,常量地址里面的内容被改了
cout<<i; //哈哈,编译器说我早就学会优化了,既然说了是常量我就不用取地址里面的内容了,就是5了~

#8


5
编译器才不像4楼这么傻呢

#9


不是有call的吗

Test* pTest = new Test();
004132CE  mov         dword ptr [ebp-0E0h],1 
004132D8  mov         eax,dword ptr [ebp-0E0h] 
004132DE  push        eax  
004132DF   call        operator new (411203h) 
004132E4  add         esp,4 
004132E7  mov         dword ptr [ebp-0D4h],eax 
004132ED  cmp         dword ptr [ebp-0D4h],0 
004132F4  je          main+6Ch (41331Ch) 
004132F6  mov         ecx,dword ptr [ebp-0E0h] 
004132FC  push        ecx  
004132FD  push        0    
004132FF  mov         edx,dword ptr [ebp-0D4h] 
00413305  push        edx  
00413306   call        @ILT+505(_memset) (4111FEh) 
0041330B  add         esp,0Ch 
0041330E  mov         eax,dword ptr [ebp-0D4h] 
00413314  mov         dword ptr [ebp-0E8h],eax 
0041331A  jmp         main+76h (413326h) 
0041331C  mov         dword ptr [ebp-0E8h],0 
00413326  mov         ecx,dword ptr [ebp-0E8h] 
0041332C  mov         dword ptr [pTest],ecx 

#10


插一句,第2题结果未定义,以前碰到这个问题的时候查过标准了,哈哈

#11


谁说这个call了。。。 。。。

#12


1 不CALL
2 哈哈,编译器说我早就学会优化了,既然说了是常量我就不用取地址里面的内容了,就是5了~ 

#13


同意ls