【发布时间】:2010-07-18 11:41:10
【问题描述】:
在回答另一个问题时,我想到了以下示例:
void *p;
unsigned x = 17;
assert(sizeof(void*) >= sizeof(unsigned));
*(unsigned*)&p = 17; // (1)
memcpy(&p, &x, sizeof(x)); // (2)
第 1 行打破了别名规则。但是,第 2 行是可以的。别名规则。问题是:为什么?编译器是否有关于 memcpy 等函数的特殊内置知识,或者是否有其他一些规则可以使 memcpy 正常?有没有办法在标准 C 中实现类似 memcpy 的函数而不破坏别名规则?
【问题讨论】:
标签: c++ c strict-aliasing