C++ 标准对未对齐的内存访问有何规定?
我已经搜索了有关未对齐访问的标准,但没有找到任何内容(可能是我无意中发现的) 这是未定义的行为吗?它是实现定义的吗 由于当前的许多CPU都支持未对齐的访问,因此未对齐的内存访问由实现定义是明智的。是这样吗 我所说的未对齐访问是指,例如:C++ 标准对未对齐的内存访问有何规定?,c++,language-lawyer,c++17,memory-alignment,C++,Language Lawyer,C++17,Memory Alignment,我已经搜索了有关未对齐访问的标准,但没有找到任何内容(可能是我无意中发现的) 这是未定义的行为吗?它是实现定义的吗 由于当前的许多CPU都支持未对齐的访问,因此未对齐的内存访问由实现定义是明智的。是这样吗 我所说的未对齐访问是指,例如: alignas(int) char buffer[sizeof(int)+1]; int &x = *new(buffer+1) int; x = 42; 不,是UB。不能在未对齐的内存中启动对象的生存期。从 类型为T的对象的生存期始于: 获得T型的
alignas(int) char buffer[sizeof(int)+1];
int &x = *new(buffer+1) int;
x = 42;
不,是UB。不能在未对齐的内存中启动对象的生存期。从 类型为T的对象的生存期始于:
- 获得T型的适当对齐和尺寸的存储,以及
- 如果对象具有非空初始化,则其初始化已完成
x
引用的对象的生存期甚至没有开始,因此除了在中提到的以外,它的任何其他用法都是UB
<>但是,您的实现允许的是,未对齐的内存(如所使用的底层架构所指定的)实际上是对齐的,从而使您的代码在C++抽象机下有效。但是,我不确定是否有编译器会这样做。我认为相关部分是[basic.align]。已定义实现。@RaymondChen:我只发现对齐值是由实现定义的。但这与未对齐的访问无关。你看到其他的东西了吗?我们怎么知道这是一个未对齐的访问
sizeof(int)
和所需的对齐都是实现定义的。可能与char的相同,但这有关系吗?假设需求为4。我的示例的行为实现是定义的还是UB?阅读引用的部分,我认为Rakete1111是正确的,它确实是UB,因为new int
是在未对齐的指针上调用的。@MaximeGroushkin编译器开发人员决定它应该返回什么。它可以返回1
,也可以(在我的GCC上)返回4
。如果硬件允许使用性能开销进行不对齐的访问,则实现仍然可以返回4
,以使(大多数)整数对齐,从而提高性能。@MaximeGroushkin它可能是alignof
返回的对齐。@geza它是显式的。抽象机器不关心底层硬件的对齐。如果编译器说内存未对齐,那么无论硬件是什么,都会得到UB。@geza我理解property为“right”,这就是alignof返回的结果。我同意,这是可以改进的。