Jos*_*eld 20 c++ memory casting representation
我们可以通过将该对象的点T
转换为a 来查看类型T*
对象的表示char*
.至少在实践中:
int x = 511;
unsigned char* cp = (unsigned char*)&x;
std::cout << std::hex << std::setfill('0');
for (int i = 0; i < sizeof(int); i++) {
std::cout << std::setw(2) << (int)cp[i] << ' ';
}
Run Code Online (Sandbox Code Playgroud)
这输出511
我的系统的表示:ff 01 00 00
.
(肯定)这里发生了一些实现定义的行为.哪个演员阵容允许我将一个转换int*
为一个unsigned char*
转换,哪个转换是否需要转换?我一投演就调用了未定义的行为?我可以投这样的任何T*
类型吗?这样做我能依靠什么?
Dav*_*men 16
哪个演员阵容允许我转换
int*
为unsigned char*
?
在这种情况下,C风格的演员阵容与之相同reinterpret_cast<unsigned char*>
.
我可以像这样投射任何T*类型吗?
是的,不是.是部分:您可以安全地将任何指针类型转换为char*
或unsigned char*
(使用适当的const
和/或volatile
限定符).结果是实现定义的,但它是合法的.
no部分:标准明确允许char*
和unsigned char*
作为目标类型.但是,您不能(例如)安全地投射double*
到int*
.这样做,你已经越过了从实现定义的行为到未定义的行为的边界.它违反了严格的别名规则.
你的演员映射到:
unsigned char* cp = reinterpret_cast<unsigned char*>(&x);
Run Code Online (Sandbox Code Playgroud)
int
定义了一个实现的底层表示,并将其作为字符查看,允许您检查它.在你的情况下,它是32位小端.
这里没有什么特别的 - 这种检查内部表示的方法对任何数据类型都有效.
C++ 03 5.2.10.7:指向对象的指针可以显式转换为指向不同类型对象的指针.除了将"指向T1的指针"的rvalue转换为"指向T2的指针"类型(其中T1和T2是对象类型,T2的对齐要求不比T1更严格)并返回其原始类型时原始指针值,这种指针转换的结果是未指定的.
这表明演员阵容导致了未指明的行为.但实际上,从任何指针类型转换为char*
总是允许您检查(和修改)引用对象的内部表示.
归档时间: |
|
查看次数: |
3928 次 |
最近记录: |