gez*_*eza 23 c++ memory-alignment language-lawyer c++17
我搜索了关于未对齐访问的标准,但没有找到任何东西(也许我是无意的).
是不确定的行为?它是实现定义的吗?
由于许多当前的CPU支持未对齐访问,因此未对齐的内存访问是实现定义的,这是明智的.是这样的吗?
通过未对齐访问,我的意思是例如:
alignas(int) char buffer[sizeof(int)+1];
int &x = *new(buffer+1) int;
x = 42;
Run Code Online (Sandbox Code Playgroud)
Rak*_*111 21
不,是UB.您无法在未对齐的内存中启动对象的生命周期.来自[basic.life] p1
类型T对象的生命周期始于:
获得具有适当对齐和T型尺寸的存储,并且
如果对象具有非空的初始化,则其初始化完成,
[...]
所以在你的例子中,引用的对象的生命周期x甚至都没有开始,所以除了[basic.life] p6中提到的其他任何用法都是UB.
但是你的实现允许做的是说未对齐的内存(由所使用的底层架构指定)实际上是对齐的,从而使你的代码在C++抽象机器下有效.我不确定是否有任何编译器这样做.
| 归档时间: |
|
| 查看次数: |
1334 次 |
| 最近记录: |