GCC 中 -faligned-new 的值

Posted

技术标签:

【中文标题】GCC 中 -faligned-new 的值【英文标题】:Value of -faligned-new in GCC 【发布时间】:2020-05-29 15:41:36 【问题描述】:

我遇到了与此类似的问题 gcc over-aligned new support (alignas ) 所以我添加了-faligned-new 编译器标志。

这修复了编译器警告。但是,当编译器使用--verbose 标志运行时,我得到这个输出https://pastebin.com/X2QZAtSb,其中最重要的一行是

COLLECT_GCC_OPTIONS='-o' 'main' '-faligned-new=1' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64'

GCC 手册 (https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gcc/C_002b_002b-Dialect-Options.html#C_002b_002b-Dialect-Options) 指出:

-faligned-新

Enable support for C++17 new of types that require more
alignment than void* ::operator new(std::size_t) provides. 
A numeric argument such as -faligned-new=32 can be used to specify how much alignment 
(in bytes) is provided by that function, but few users will need to override 
the default of alignof(std::max_align_t).

-faligned-new=1 是什么意思?如果我理解正确,它应该等于 8 或 16 或其他值(默认为 alignof(std::max_align_t)、https://en.cppreference.com/w/cpp/types/max_align_t),而不是 1。

重现编译简单的main.cpp:

#include <iostream>

int main() 
    std::cout << "hello world\n";

    return 0;

使用g++ main.cpp -o main -faligned-new --verbose

我正在 GCC 9.3.0 上编译程序,在 Debian 系统上,sizeof(max_align_t) 在我的系统上是 32。

【问题讨论】:

【参考方案1】:

-faligned-new=1 是什么意思?

显然,这意味着-faligned-new没有明确的阈值。

根据文档,在这种情况下,阈值默认为std::max_align_t 的对齐方式。

【讨论】:

这是合理的。但是我希望编译器报告的这个标志的值将是sizeof(std::max_align_t)(在我的例子中:=32)。如果 GCC 使用默认值,你有没有真正输出 some_flag_name=1 的任何来源? @Dinuirar 您的演示是一个来源。您没有指定值,--verbose 显示 1。

以上是关于GCC 中 -faligned-new 的值的主要内容,如果未能解决你的问题,请参考以下文章

存储在数组中的值在OpenMP gcc中更改

如何对同一集合中不同文档的值求和?

如何对同一集合中不同文档的值求和?

如何将内存中某个地址的值复制到 gcc AT&T 样式的寄存器中

为啥在分配没有后续函数调用的大数组时,GCC 会向堆栈指针减去错误的值?

Ali266