代码:
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!";
}
输出:
一样!
我想知道这两种铸造方法有什么区别。此外,如果您可以指定(通过示例)static_cast、dynamic_cast 和您知道的其他类型的转换之间的区别(即,同时保持尽可能低的级别并尽可能接近汇编语言)。
static_cast
dynamic_cast
const_cast
reinterpret_cast
C-style cast (type)value
Function-style cast type(value)
谢谢。
请阅读我从上面的示例中知道的 PS,reinterpret_cast 将 keyStr[29] 的地址分配给 int 指针在汇编中将转换为:
lea eax, [keyStr+1D]
mov [reCast], eax
所以换句话说,reinterpret_cast,在低层次的预期中,一点也不危险,因为它不会修改原始数据。
我想知道其他铸造方法如何以低级方式表现。因此,例如,一个对象,以低级方式,只是一个保存地址的变量。如果该对象的类型是编译器如何解释该地址以及它如何偏移它。(这正是我不感兴趣的,在汇编中,如果该变量包含值、指针或对象(即另一个指针))。另一件可能相同的事情是 int 和 int* 或 unsigned int 和 int 之间的区别;所有 4 个声明都生成相同的汇编指令。( push value ) or (sub esp-(length of int) && mov esp, value) 我希望这可以澄清问题以及为什么我将其标记为“低级代码”和“程序集”
PS 在这个程序中,我正在尝试创建我不关心不可移植性或其他高级别的东西。我正在尝试尽可能低级并尽可能接近汇编语言。这意味着,对于这个程序,内存只是内存(即 0 和 1 位)并且类型并不重要(例如,我不在乎 mem address: 0x123 是“int”类型还是“float”类型,它只是“数据”)