问题标签 [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.

0 投票
4 回答
17663 浏览

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 不仅警告,而且确实忽略了我对对齐的愿望。

0 投票
1 回答
918 浏览

c++ - alignas(T) 未在模板函数中解析

当使用带有MinGW(版本:4.8.1)的Eclipse编译以下代码片段时,它可以通过但Eclipse仍然报告:“此行的多个标记 - 无法解析类型'alignas'”

这个问题发生了什么,虽然代码片段通过了编译,但 Eclipse 标记错误。有人遇到过这个问题吗?请帮我解决这个问题,非常感谢!

0 投票
3 回答
5214 浏览

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) 所做的!

0 投票
1 回答
131 浏览

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 警告“忽略模板参数上的属性”,这听起来不错但很危险。

0 投票
1 回答
1583 浏览

c++ - 努力使用对齐语法

我正在尝试使用alignas作为类成员的指针,坦率地说,我不确定我应该把它放在哪里。

例如:

我希望这能确保 ptr 的数据在 64 字节块上对齐。使用英特尔编译器,它不会。

谁能指出我正确的方向?

0 投票
3 回答
1425 浏览

c++ - 如何指定指向未对齐int的指针?

我还尝试了以下方法,它们都无法在 clang 中编译:

0 投票
1 回答
1220 浏览

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 来做到这一点?

0 投票
1 回答
806 浏览

c++ - 32 位平台上结构中的对齐

为 32 位 x86 linux 运行以下代码(编译器标志:g++ -std=c++14 -m32)时,我得到了意想不到的结果。我尝试了 gcc 和 clang。

输出是:

这里发生了什么?为什么 S1 和 S2 的大小不同?据我了解,64 位整数值在 32 位 x86 机器上与 32 位对齐。这确实解释了为什么 S1 的大小是 12 字节。但是为什么这不适用于 S2?

0 投票
2 回答
1506 浏览

c++ - 不尊重 alignas 关键字

我想在缓存边界上过度对齐我的类型,所以我使用了alignas

这编译得很好。但是,令我惊讶的是,当我尝试分配一堆Ws 时,它们不是 64 字节对齐的,而是实际上是 16 字节对齐的:

产量:

在几个编译中(gcc 4.8.2、gcc 5.2.0、clang 3.7.1)。这是怎么回事?我告诉它对齐,为什么它不对齐?

0 投票
1 回答
163 浏览

c++ - gcc alignas 问题与指向对象的成员指针

我正在使用 gcc 4.9.2,并且正在尝试正确对齐静态初始化的数组以与 AVX 一起使用。以下是由于对齐问题而导致段错误的代码要点:

在我的系统上,数组 a.b2->x 未在 32 字节边界上对齐。x 的大小无关紧要,只要 x 是一个数组即可(因此“double x = 0”可以正常工作)。如果我改为将指针指向 B 静态分配的成员,它就可以正常工作。如果我在 main 中创建局部变量 *b1 和 *b2,它可以正常工作。如果我在 A 类和 posix_memalign 中使用动态分配的数组,它可以正常工作。

我是不是对对齐有误解。