码:
char keyStr[50]={ 0x5F, 0x80 /* bla bla */ };
uint32_t* reCast = reinterpret_cast< uint32_t* >( &keyStr[29] );
uint32_t* reCast2 = ( uint32_t* )&keyStr[29];
if( reCast == reCast2 ){
cout << "Same Thing!";
}
Run Code Online (Sandbox Code Playgroud)
输出:
一样!
我想知道这两种铸造方法有什么区别。另外,如果您可以(通过示例)指定static_cast,dynamic_cast和您知道的其他类型的转换之间的差异(即,保持较低的级别并尽可能接近汇编语言)。
static_cast
dynamic_cast
const_cast
reinterpret_cast
C-style cast (type)value
Function-style cast type(value)
Run Code Online (Sandbox Code Playgroud)
谢谢。
请阅读我从上面的示例中了解到的PS,reinterpret_cast将int指针分配给int指针keyStr [29]的地址在汇编中将转换为:
lea eax, [keyStr+1D]
mov [reCast], eax
Run Code Online (Sandbox Code Playgroud)
因此,换句话说,从低级别的角度来看,reinterpret_cast根本没有危险,因为它不会修改原始数据。
我想知道其他铸造方法在低水平方面的表现。因此,例如,对象以低级方式仅仅是保存地址的变量。以及该对象的类型是编译器随后如何解释该地址及其偏移量。对象(即另一个指针))。另一件事可能是相同的,就是int和int *或unsigned int和int之间的区别;所有4个声明都生成相同的汇编指令。(推送值)或(sub esp-(int的长度)&& mov esp,值)我希望这可以澄清问题,以及为什么我将其标记为“低级代码”和“汇编”
PS在此程序中,我尝试创建我不在乎非可移植性或其他高级内容。我正在尝试尽可能降低级别,并尽可能接近汇编语言。这意味着,对于该程序,内存只是内存(即0和1位),类型并不重要(例如,我不在意内存地址:0x123是“ int”类型还是“ float”类型,只是“数据”)