【发布时间】:2015-02-06 05:23:29
【问题描述】:
代码:
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)
谢谢。
请阅读 P.S. 我从上面的示例中知道 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) 我希望这能澄清问题以及为什么我将其标记为“低级代码”和“程序集”
附:在这个程序中,我正在尝试创建我不关心不可移植性或其他高级别的东西。我正在尝试尽可能低级并尽可能接近汇编语言。这意味着,对于这个程序,内存只是内存(即 0 和 1 位)并且类型并不重要(例如,我不在乎 mem address: 0x123 是“int”类型还是“float”类型,它只是“数据”)
【问题讨论】:
-
这个问题不同,因为它不要求高水平的东西。保持真实,并记住对象只是内存中结构化的普通数据。
-
阅读副本后还有什么问题没有得到解答?
-
重复的问题确实回答了我的大部分问题,但没有对幕后发生的事情提供公平的解释。我将编辑问题以添加更多详细信息。
-
请注意,将
uint32_t*转换为指向char[]数组对象是 C 和 C++ 中的严格别名未定义行为。 (除非您使用的是 MSVC,它定义了各种指针的别名行为。)
标签: c++ c assembly casting low-level-code