Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 标准对未对齐的内存访问有何规定?_C++_Language Lawyer_C++17_Memory Alignment - Fatal编程技术网

C++ 标准对未对齐的内存访问有何规定?

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型的

我已经搜索了有关未对齐访问的标准,但没有找到任何内容(可能是我无意中发现的)

这是未定义的行为吗?它是实现定义的吗

由于当前的许多CPU都支持未对齐的访问,因此未对齐的内存访问由实现定义是明智的。是这样吗

我所说的未对齐访问是指,例如:

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返回的结果。我同意,这是可以改进的。