我正在寻找一份关于C++中内存对齐、典型方法、编译器之间的区别和常见陷阱的好(全面的)文档。这样可以检查我的对该主题的理解是否正确,并学习新知识。
这个问题是受到我回答另一个问题时使用以下结构的启发:
char const buf[1000] = ...;
unsigned int i = *reinterpret_cast<unsigned int*>(buf + shift); // shift can be anything
这种方法因不符合内存对齐规则而受到批评。您能否作为额外的奖励解释一下,从内存对齐的角度来看,这种方法存在什么缺陷?非常感谢您提供一个举例说明该方法不能正常工作。我知道这种方法通常是不好的,但在网络协议实现中经常使用它,所以这更多是一个实践问题,而不是理论问题。
此外,请不要在此处提到严格别名,这是另一个问题。
shift
是 4 的倍数,也不能保证buf
的起始地址是 4 的倍数。 - nos1
。将int放入一个1对齐的结构中,您确实可以安全地在任何偏移量处进行解引用。产生的开销取决于您的CPU架构;在x86上,它不应该过于痛苦。 - bdonlan