- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我很难找到有关 GCC 的 aligned-new 警告和 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 文档非常缺乏。
最佳答案
来自 gcc's manual :
-faligned-new
Enable support for C++17new
of types that require more alignment thanvoid* ::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 ofalignof(std::max_align_t)
.
这意味着 -faligned-new 只是让 aligned-new 功能添加到 P0035R4 中无需完全启用 C++17 支持即可使用。
C++标准中的相关位:
来自 [cpp.predefined]:
__STDCPP_DEFAULT_NEW_ALIGNMENT__
An integer literal of typestd::size_t
whose value is the alignment guaranteed by a call tooperator new(std::size_t)
oroperator new[](std::size_t)
. [ Note: Larger alignments will be passed tooperator new(std::size_t, std::align_val_t)
, etc. (8.3.4). — end note ]
来自 [basic.align/3]:
A new-extended alignment is represented by an alignment greater than
__STDCPP_DEFAULT_NEW_ALIGNMENT__
来自 [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 typestd::align_val_t
.
所以在你使用 C++17 或 -faligned-new 的情况下,因为 Foo
有 new-extended alignment,Foo* f = new Foo( );
将调用 void* operator new(size_t, align_val_t)
来分配内存并返回指向在 64- 上正确对齐的 Foo
对象的指针字节边界。根据早期标准,情况并非如此。
关于c++ - gcc 过度对齐的新支持 (alignas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49373287/
我正在开发适用于 Wordpress 的 PSD,并面临着根据颜色过度对齐背景图像或相反的问题。 在桌面上一切都很好,但在移动设备上背景图像变小了(我使用了 background-size: 100%
在标准 Modelica 流体流量源中,通常指定流量或压力。例如,以下边界设置(P 表示压力边界,F 表示流量边界)通常会围绕管道组件: P - 管道 - P F - 管道 - P 但是,有时在同一侧
我正处于设计基于 Azure 的应用程序的早期阶段。考虑到我可能预期的需求的变化性,Azure 吸引我的地方之一是它的可扩展性。因此,我试图保持事物松散耦合,以便我可以在需要时添加实例。 我看到的关于
我与 Xcode 4 dot notation code sense problem 正好相反!点符号的代码完成不仅显示属性,还显示我的方法(在每个完成的左侧标记 P 或 M 分别指示它是属性还是方法
我是一名优秀的程序员,十分优秀!