gcc over-aligned new support (alignas )

后端 未结 1 1498
离开以前
离开以前 2020-12-11 02:20

I\'m having some difficulty finding more information about GCC\'s aligned-new warning and the gcc -faligned-new option. Compiling on gcc 7.2.0 (without --std=c++17) and try

1条回答
  •  盖世英雄少女心
    2020-12-11 02:41

    From gcc's manual:

    -faligned-new
    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).

    This implies that -faligned-new simply makes the aligned-new features added in P0035R4 available without fully enabling C++17 support.

    The relevant bits from the C++ standard:
    From [cpp.predefined]:

    __STDCPP_DEFAULT_NEW_ALIGNMENT__
    An integer literal of type std::size_t whose value is the alignment guaranteed by a call to operator new(std::size_t) or operator new[](std::size_t). [ Note: Larger alignments will be passed to operator new(std::size_t, std::align_val_t), etc. (8.3.4). — end note ]

    From [basic.align/3]:

    A new-extended alignment is represented by an alignment greater than __STDCPP_DEFAULT_NEW_ALIGNMENT__

    And from [expr.new/14]:

    Overload resolution is performed on a function call created by assembling an argument list. The first argument is the amount of space requested, and has type std::size_t. If the type of the allocated object has new-extended alignment, the next argument is the type’s alignment, and has type std::align_val_t.


    So in your case with C++17 or -faligned-new, since Foo has new-extended alignment, Foo* f = new Foo(); will call void* operator new(size_t, align_val_t) to allocate memory and return a pointer to a Foo object that is properly aligned on a 64-byte boundary. Under earlier standards that was not the case.

    0 讨论(0)
提交回复
热议问题