gpt4 book ai didi

c++ - 如何使用 alignof 强制对齐堆分配?

转载 作者:行者123 更新时间:2023-11-30 02:48:39 25 4
gpt4 key购买 nike

我想强制特定的堆分配返回一个 64 字节对齐的地址,因为这是缓存行边界。我以为我可以这样做

int *p = new alignas(64) int;

但我的编译器似乎都没有给 p 一个 64 的倍数的地址。这是我检查的方式:

#include <iostream>

int main()
{
int *p = new alignas(64) int;
std::cout << long(p) % 64 << '\n'; // should print 0
}

我一定是做错了什么。但是什么?

最佳答案

new 运算符调用的分配器分配空间“假定返回指向存储的指针,该存储与基本的任何类型的对象适当对齐alignment”(§3.7.4.1/2;引用自 §5.3.4/11)。alignas(64) 可能不是您的编译器和环境的“基本对齐”,因此分配函数不需要尊重它。

请注意,分配函数仅传递请求的空间量;它不知道请求的对齐方式是什么。因此,它无法调整其结果以满足特殊需要。

alignas 类型说明符设计用于静态和自动对象。对于这样的对象,如果它是基本的,则必须遵守请求的对齐方式,并且在理想的世界中,如果编译器不能保证遵守扩展对齐方式,则会产生错误消息。 (不过,我不认为它有义务这样做;gcc 和 clang 都会生成可执行文件,如果请求大量堆栈对齐,就会出现段错误。)

关于c++ - 如何使用 alignof 强制对齐堆分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21895038/

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