问题标签 [alignas]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 我在哪里可以在 C++11 中使用 alignas()?
为了标准化我的代码并使其更具可移植性,我替换了
和
在 C++11 中。但是,gnu(4.8)不喜欢这样,但抱怨
而 clang 3.2 不会产生任何警告(即使使用-Weverything -Wno-c++98-compat -pedantic
)。所以我想知道我上面的代码是否正确,更一般地说,alignas()
可以和不可以放在哪里。
编辑(2013 年 4 月):
标准中的相关条款是 7.6.2,特别是 7.6.2.1
对齐说明符可以应用于变量或类数据成员,但不应应用于位字段、函数参数、catch 子句(15.3)的形式参数或用注册存储类说明符。对齐说明符也可以应用于类或枚举类型的声明。带有省略号的对齐说明符是包扩展 (14.5.3)。
正如 Red XIII 已经挖掘出来的那样。但是,我不够专业,不知道这对我上面的测试意味着什么。
如果 clang 接受我的属性这一事实意味着什么,那么也许值得一提的是,当尝试使用using
指令而不是 atypedef
时,clang 也会抱怨。此外,与此问题早期版本中的声明相反,gcc 不仅警告,而且确实忽略了我对对齐的愿望。
c++ - alignas(T) 未在模板函数中解析
当使用带有MinGW(版本:4.8.1)的Eclipse编译以下代码片段时,它可以通过但Eclipse仍然报告:“此行的多个标记 - 无法解析类型'alignas'”
这个问题发生了什么,虽然代码片段通过了编译,但 Eclipse 标记错误。有人遇到过这个问题吗?请帮我解决这个问题,非常感谢!
c++ - 如何使用 alignas 替换 pragma pack?
我试图了解应该如何使用 alignas,我想知道它是否可以替代 pragma pack,我已经努力验证它但没有运气。使用 gcc 4.8.1 ( http://ideone.com/04mxpI ) 我总是得到低于 STestAlignas 的 8 个字节,而使用 pragma pack 它是 5 个字节。我想要实现的是让 sizeof(STestAlignas) 返回 5。我尝试在 clang 3.3 ( http://gcc.godbolt.org/ ) 上运行此代码,但出现错误:
!!错误:对于“long”类型,请求的对齐小于 8 的最小对齐 - 刚好低于 alignas 的使用。
那么也许 alignas 有一个最小对齐值?
下面是我的测试代码:
gcc 4.8.1 的结果:
[26.08.2019]
在这个主题中似乎有一些标准化运动。p1112 提案 -类布局控制的语言支持- 建议添加(除其他外)[[layout(smallest)]]
属性,该属性应重新排序类成员,以使对齐成本尽可能小(这是程序员之间的常用技术 - 但它通常会破坏类定义的可读性) . 但这不等于 pragma(pack) 所做的!
c++ - “natural_alignment_of” type_trait?
在 C++11 中,我们现在有了alignas
关键字,它可以用来定义一个新类型,它只是一个现有类型,但具有更严格的对齐方式,例如通过 typedef:
有没有办法以编程方式,给定 atypename T
来确定类型的原始“自然”对齐方式?类似于以下natural_alignment_of
可以编译的概念 type_trait :
背景:
我正在编写模板代码以作用于所有标量类型。一般来说,整数( sizeof( T ) == alignof( T ) )
是正确的,但在官方alignas
支持下,我认为我不能再做这个假设了。
推测:
也许类似的东西std::decay
会起作用?测试代码,我看到 G++4.8 警告“忽略模板参数上的属性”,这听起来不错但很危险。
c++ - 努力使用对齐语法
我正在尝试使用alignas
作为类成员的指针,坦率地说,我不确定我应该把它放在哪里。
例如:
我希望这能确保 ptr 的数据在 64 字节块上对齐。使用英特尔编译器,它不会。
谁能指出我正确的方向?
c++ - 如何指定指向未对齐int的指针?
我还尝试了以下方法,它们都无法在 clang 中编译:
c++ - 使用 alignas 对齐结构
在以下结构中:
如何使用alignas
这样sizeof(test)
正好是 6 个字节?
alignas(1)
编译器(gcc、msvc、clang)不接受(错误如:)error: requested alignment is less than minimum alignment of 4 for type 'test'
。
UPD。当然,此变体可以正常工作:
但是有没有办法在没有预处理器的情况下只使用标准 C++11/14 来做到这一点?
c++ - 32 位平台上结构中的对齐
为 32 位 x86 linux 运行以下代码(编译器标志:g++ -std=c++14 -m32)时,我得到了意想不到的结果。我尝试了 gcc 和 clang。
输出是:
这里发生了什么?为什么 S1 和 S2 的大小不同?据我了解,64 位整数值在 32 位 x86 机器上与 32 位对齐。这确实解释了为什么 S1 的大小是 12 字节。但是为什么这不适用于 S2?
c++ - 不尊重 alignas 关键字
我想在缓存边界上过度对齐我的类型,所以我使用了alignas
:
这编译得很好。但是,令我惊讶的是,当我尝试分配一堆W
s 时,它们不是 64 字节对齐的,而是实际上是 16 字节对齐的:
产量:
在几个编译中(gcc 4.8.2、gcc 5.2.0、clang 3.7.1)。这是怎么回事?我告诉它对齐,为什么它不对齐?
c++ - gcc alignas 问题与指向对象的成员指针
我正在使用 gcc 4.9.2,并且正在尝试正确对齐静态初始化的数组以与 AVX 一起使用。以下是由于对齐问题而导致段错误的代码要点:
在我的系统上,数组 a.b2->x 未在 32 字节边界上对齐。x 的大小无关紧要,只要 x 是一个数组即可(因此“double x = 0”可以正常工作)。如果我改为将指针指向 B 静态分配的成员,它就可以正常工作。如果我在 main 中创建局部变量 *b1 和 *b2,它可以正常工作。如果我在 A 类和 posix_memalign 中使用动态分配的数组,它可以正常工作。
我是不是对对齐有误解。