gpt4 book ai didi

c++ - 为什么 std::aligned_storage 的分配总是有一个偏移量?

转载 作者:可可西里 更新时间:2023-11-01 18:28:08 25 4
gpt4 key购买 nike

分配 std::aligned_storage<2, 4096>::type 时在堆上,我总是得到一个偏移 16 个字节的指针(在 x64 上;在 x86 上它偏移 8 个字节)。换句话说,这:

#include <iostream>
#include <cstddef>

int main() {
typedef std::aligned_storage<2, 4096>::type MemPage;

MemPage* p_mp = new MemPage;

std::cout << (void*)p_mp << std::endl;

return 0;
}

给我(例如)

0x72f010

尽管我希望最后三位数字全部为零。分配 std::aligned_storage<>::type 时在堆栈上,一切都按预期工作。

我在 ubuntu 14.04 上使用 gcc-4.8.2 x86_64。

最佳答案

不太清楚对齐要求如何转换为使用 new 分配的存储。该标准在 [expr.new] 中维护

It is implementation-defined whether over-aligned types are supported (3.11).

[基本对齐]/3:

An extended alignment is represented by an alignment greater than alignof(std::max_align_t). It is implementation-defined whether any extended alignments are supported and the contexts in which they are supported (7.6.2). A type having an extended alignment requirement is an over-aligned type.

GCC 可能不支持过度对齐的类型,并且这种“不支持”可能(而不是编译器错误)导致分配函数仅返回与最严格的基本对齐: sizeof(std::max_align_t)。如果后者的值在你的机器上是 16,那就说明地址是 16 的倍数。

另请注意,尽管运行时分配函数将具有最大支持的对齐方式,operator new 基本上不会考虑所需的对齐方式,因为它没有可以采用相应值并传递的参数它到运行时环境分配功能。此问题是已知的,并且是 EWG-issue 的主题.


有趣的事实:上面的代码正在调用 UB。考虑 [meta.trans.ptr] 中的表格,其中列出了 aligned_storage 的第二个模板参数的要求:

Align shall be equal to alignof(T) for some type T or to default-alignment.

如果没有类型 T 具有 4096 的对齐方式,则模板参数的要求不符合。什么类型的对齐方式为 212

不过,这对问题的本质来说并不重要。我们可以只使用带有自己的 typedef 的 new

关于c++ - 为什么 std::aligned_storage 的分配总是有一个偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27217656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com