【问题标题】:What does __attribute__ ((aligned(x))) do?__attribute__ ((aligned(x))) 做什么?
【发布时间】:2021-12-28 15:28:33
【问题描述】:

该问题的现有答案对我来说没有一个更清楚。我不知道当一个变量被声明为“在 x 字节的边界内”时它应该是什么意思,这是每个问题中关于这个问题的答案。我需要一个实际的解释,举例说明它是什么,与没有该属性声明的变量相比它做了什么,以及为什么应该使用它。

额外问题:当在像这里 __attribute__ ((aligned (32))) double output[4]; 这样的数组前面使用时,这是否意味着数组的每个元素都对齐,或者只是整个数组?

提前致谢。

【问题讨论】:

  • __attribute__ 不是 C++ 关键字。这可能是您正在使用的编译器的一个功能。您应该指定您的编译器,否则答案将基于猜测。
  • 参见例如songho.ca/misc/alignment/dataalign.html 关于对齐是什么
  • "我需要一个实际的解释,并举例说明它是什么" 你知道什么是“字节”吗?你知道字节“边界”是什么吗?

标签: c++ memory-alignment


【解决方案1】:

C++ 语言中没有__attribute__ 这样的东西。 __attribute__ 是 GCC 和兼容编译器的语言扩展。

__attribute__ ((aligned (X))) 与标准的alignas 说明符基本相同:

// non-standard
__attribute__ ((aligned (32))) double output[4];

// standard
alignas(32) double output[4];

每个对象都有一个内存地址,该地址指定字节在内存中存储对象的位置。地址的底层表示是一个整数。当地址的个数可以被 X 整除时,内存地址对齐到 X 字节。

每种类型都对可以存储该类型对象的地址的对齐有最低要求。 alignas可以用来增加需求。

当在数组前面使用时……这是否意味着数组的每个元素都对齐,或者只是整个数组?

整个数组是对齐的。不是单个元素

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2019-03-05
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    相关资源
    最近更新 更多