首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用alignof强制堆分配对齐?

如何使用alignof强制堆分配对齐?
EN

Stack Overflow用户
提问于 2014-02-20 07:40:35
回答 2查看 854关注 0票数 1

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

代码语言:javascript
复制
int *p = new alignas(64) int;

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

代码语言:javascript
复制
#include <iostream>

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

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

EN

回答 2

Stack Overflow用户

发布于 2014-02-20 07:56:23

new操作符为分配空间而调用的分配器“被假定为返回指向存储的指针,该指针针对具有基本对齐的任何类型的对象进行了适当的对齐”(§3.7.4.1/2;引用自§5.3.4/11)。对于您的编译器和环境,alignas(64)可能不是一个“基本的对齐”,所以分配函数不需要考虑它。

因此,它无法调整其结果以满足特殊需求。

alignas类型说明符设计用于处理静态和自动对象。对于这样的对象,如果请求的对齐是基本的,则必须遵守它,在理想情况下,如果编译器不能保证扩展对齐将得到遵守,它将生成错误消息。(不过,我不认为它必须这样做;如果请求了巨大的堆栈对齐,那么gcc和clang都会产生segfault的可执行文件。)

票数 2
EN

Stack Overflow用户

发布于 2014-02-20 07:48:47

请求超出所需的64个字节,然后在分配的空间内生成一个缓存对齐的地址。注意在结束时释放整个分配的内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21895038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档