【问题标题】:gcc over-aligned new support (alignas )gcc 过度对齐的新支持 (alignas)
【发布时间】:2018-08-28 14:56:12
【问题描述】:

我很难找到有关 GCC 的对齐新警告和 gcc -faligned-new 选项的更多信息。在 gcc 7.2.0 上编译(没有 --std=c++17)并尝试定义一个对齐的结构,例如:

struct alignas(64) Foo { int x; }

只是做一个简单的旧:

Foo * f = new Foo();

给我以下警告和建议:

 alignas.cpp:36:25: warning: ‘new’ of type ‘Foo’ with extended alignment 64 [-Waligned-new=]
 Foo * f = new Foo();
                     ^
 alignas.cpp:36:25: note: uses ‘void* operator new(long unsigned int)’, which does not have an alignment parameter
 alignas.cpp:36:25: note: use ‘-faligned-new’ to enable C++17 over-aligned new support

我知道默认情况下new 只会返回与alignof( std::max_align_t ) 对齐的内存(对我来说是 16),但我不清楚的是,如果我通过 -faligned-new,gcc 现在是否会正确执行new 代表我的新对齐方式?

不幸的是,关于这方面的 gcc 文档非常缺乏。

【问题讨论】:

    标签: c++ gcc gcc-warning alignas


    【解决方案1】:

    来自gcc's manual

    -faligned-新
    启用对 C++17 new 类型的支持,这些类型需要比 void* ::operator new(std::size_t) 提供的更多对齐。诸如 -faligned-new=32 之类的数字参数可用于指定该函数提供多少对齐(以字节为单位),但很少有用户需要覆盖默认值 alignof(std::max_align_t)

    这意味着 -faligned-new 只是使 P0035R4 中添加的对齐新功能可用,而无需完全启用 C++17 支持。

    来自 C++ 标准的相关位:
    来自 [cpp.predefined]:

    __STDCPP_DEFAULT_NEW_ALIGNMENT__
    std::size_t 类型的整数文字,其值是通过调用 operator new(std::size_t)operator new[](std::size_t) 保证的对齐方式。 [注意:更大的对齐将传递给operator new(std::size_t, std::align_val_t)等(8.3.4)。 ——尾注]

    来自 [basic.align/3]:

    新扩展对齐由大于__STDCPP_DEFAULT_NEW_ALIGNMENT__的对齐表示

    来自 [expr.new/14]:

    对通过组合参数列表创建的函数调用执行重载解析。第一个参数是请求的空间量,类型为std::size_t。如果分配对象的类型具有新扩展对齐,则下一个参数是该类型的对齐,类型为std::align_val_t


    因此,在您使用 C++17 或 -faligned-new 的情况下,由于 Foo 具有 新扩展对齐Foo* f = new Foo(); 将调用 void* operator new(size_t, align_val_t) 来分配内存并返回一个指针到在 64 字节边界上正确对齐的 Foo 对象。根据早期的标准,情况并非如此。

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 2014-08-25
      • 2017-06-27
      • 2017-12-07
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 2016-07-30
      相关资源
      最近更新 更多