首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >alignas说明符与'new‘一起工作吗?

alignas说明符与'new‘一起工作吗?
EN

Stack Overflow用户
提问于 2013-03-20 06:41:17
回答 2查看 6.4K关注 0票数 16

我的问题很简单;

alignas说明符与'new‘一起工作吗?也就是说,如果一个结构被定义为要对齐,那么当使用new分配时,它是否会被对齐?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-20 07:03:57

在使用C++17之前,如果您的类型的对齐方式没有过度对齐,那么可以使用默认的new。“Over- alignment”表示您在alignas中指定的对齐方式大于alignof(std::max_align_t)。默认new或多或少会意外地使用非过度对齐类型;默认内存分配器总是以等于alignof(std::max_align_t)的对齐方式分配内存。

但是,如果您的类型对齐过度,那么您就不走运了。无论是默认的new,还是您编写的任何全局new操作符,都无法知道类型所需的对齐方式,更不用说为其分配适当的内存了。解决这种情况的唯一方法是重载类的operator new,这将能够查询类与alignof的对齐情况。

当然,如果这个类被用作另一个类的成员,这就没有什么用处了。除非另一个类也重载了operator new。所以像new pair<over_aligned, int>()这样简单的东西是行不通的。

C++17 adds a number of memory allocators,给出正在使用的类型的对齐方式。这些分配器专门用于过度对齐的类型(或者更具体地说,new-extended over-aligned types)。因此,new pair<over_aligned, int>()将在C++17中工作。

当然,这只在分配器处理过度对齐的类型时有效。

票数 14
EN

Stack Overflow用户

发布于 2015-05-14 07:34:19

不不是的。该结构将被填充到所请求的对齐方式,但不会对齐。然而,这有可能是allowed in C++17 (这个C++17提案存在的事实应该很好地证明这不能在C++11中工作)。

我已经看到这似乎与一些内存分配器一起工作,但这纯粹是运气。例如,一些内存分配器会将它们的内存分配与所请求大小的2的幂(最大4KB)对齐,作为对分配器的优化(减少内存碎片,可能会更容易重用先前释放的内存,等等)。但是,我测试的OSX10.7和CentOS 6系统中包含的新的/malloc实现没有做到这一点,并且使用以下代码失败:

代码语言:javascript
复制
#include <stdlib.h>
#include <assert.h>

struct alignas(8)   test_struct_8   { char data; };
struct alignas(16)  test_struct_16  { char data; };
struct alignas(32)  test_struct_32  { char data; };
struct alignas(64)  test_struct_64  { char data; };
struct alignas(128) test_struct_128 { char data; };
struct alignas(256) test_struct_256 { char data; };
struct alignas(512) test_struct_512 { char data; };

int main() {
   test_struct_8   *heap_8   = new test_struct_8;
   test_struct_16  *heap_16  = new test_struct_16;
   test_struct_32  *heap_32  = new test_struct_32;
   test_struct_64  *heap_64  = new test_struct_64;
   test_struct_128 *heap_128 = new test_struct_128;
   test_struct_256 *heap_256 = new test_struct_256;
   test_struct_512 *heap_512 = new test_struct_512;

#define IS_ALIGNED(addr,size)   ((((size_t)(addr)) % (size)) == 0)

   assert(IS_ALIGNED(heap_8, 8));
   assert(IS_ALIGNED(heap_16, 16));
   assert(IS_ALIGNED(heap_32, 32));
   assert(IS_ALIGNED(heap_64, 64));
   assert(IS_ALIGNED(heap_128, 128));
   assert(IS_ALIGNED(heap_256, 256));
   assert(IS_ALIGNED(heap_512, 512));

   delete heap_8;
   delete heap_16;
   delete heap_32;
   delete heap_64;
   delete heap_128;
   delete heap_256;
   delete heap_512;

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

https://stackoverflow.com/questions/15511909

复制
相关文章

相似问题

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