在C++ 03中,表达式是rvalue或lvalue.
在C++ 11中,表达式可以是:
两类已成为五大类.
当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?
我使用一个代码,我将枚举*转换为int*.像这样的东西:
enum foo { ... }
...
foo foobar;
int *pi = reinterpret_cast<int*>(&foobar);
Run Code Online (Sandbox Code Playgroud)
在编译代码(g ++ 4.1.2)时,我收到以下警告消息:
dereferencing type-punned pointer will break strict-aliasing rules
Run Code Online (Sandbox Code Playgroud)
我用Google搜索了这条消息,发现只有在严格的别名优化打开时才会发生这种情况.我有以下问题:
是的,我实际上需要这种别名.
我无法完全理解我在这里阅读的内容的后果:将一个int指针转换为char ptr,反之亦然
总之,这会有用吗?
set4Bytes(unsigned char* buffer) {
const uint32_t MASK = 0xffffffff;
if ((uintmax_t)buffer % 4) {//misaligned
for (int i = 0; i < 4; i++) {
buffer[i] = 0xff;
}
} else {//4-byte alignment
*((uint32_t*) buffer) = MASK;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
有一个长时间的讨论(它是在评论中,神秘地删除了)关于指针应该被铸造到什么类型以检查对齐.现在讨论这个问题.
我读过这篇关于C/C++严格别名的文章.我认为同样适用于C++.
据我了解,严格别名用于重新排列代码以进行性能优化.这就是为什么两个不同(在C++情况下不相关)类型的指针不能引用相同的内存位置的原因.
这是否意味着只有在修改内存时才会出现问题?除了内存对齐可能存在的问题.
例如,处理网络协议或反序列化.我有一个字节数组,动态分配和数据包结构正确对齐.我reinterpret_cast可以使用我的数据包结构吗?
char const* buf = ...; // dynamically allocated
unsigned int i = *reinterpret_cast<unsigned int*>(buf + shift); // [shift] satisfies alignment requirements
Run Code Online (Sandbox Code Playgroud) 我的公司使用消息服务器将消息const char*收集到a中,然后将其转换为消息类型.
在提出这个问题之后,我对此感到担忧.我不知道消息服务器中有任何不良行为.const变量是否可能不会出现锯齿问题?
例如,假设foo是以下列MessageServer方式之一定义的:
void MessageServer(const char* foo)MessageServer:const char* foo = PopMessage();现在MessageServer是一个巨大的功能,但它从来没有指派任何事情foo在1点但是,MessageServer的逻辑foo 将被转换为所选择的消息类型.
auto bar = reinterpret_cast<const MessageJ*>(foo);
Run Code Online (Sandbox Code Playgroud)
bar 将仅从随后读取,但将广泛用于对象设置.
这里是否存在别名问题,或者foo只是初始化并且从未修改过的事实会保存我吗?
编辑:
Jarod42的回答中找到与从铸造没有问题const char*的MessageJ*,但我不知道这是有道理的.
我们知道这是非法的:
MessageX* foo = new MessageX;
const auto bar = reinterpret_cast<MessageJ*>(foo);
Run Code Online (Sandbox Code Playgroud)
我们是否以某种方式说这是合法的?
MessageX* foo = new MessageX;
const auto temp = reinterpret_cast<char*>(foo);
auto bar = reinterpret_cast<const MessageJ*>(temp); …Run Code Online (Sandbox Code Playgroud) 关于铸造,我很困惑char to int pointer.我正在检查指针的转换是如何工作的,以下代码int to char工作正常.
#include <iostream>
using namespace std;
int main(){
int a=65;
void *p=&a;
cout << *static_cast<char*>(p);
}
Run Code Online (Sandbox Code Playgroud)
产量
A
Run Code Online (Sandbox Code Playgroud)
但是,当我试图从char to int它投出时没有显示正确的价值.
#include <iostream>
using namespace std;
int main(){
char a='A';
void *p=&a;
cout << *static_cast<int*>(p);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码有什么问题?输出是关于垃圾值.