【问题标题】:C++ aligned unaligned property of arrays数组的 C++ 对齐未对齐属性
【发布时间】:2012-07-23 15:22:27
【问题描述】:

编辑:这是我的一个工作项目。在职的。 我在 .cpp 文件的开头声明了一些 char 数组(甚至在 #include 部分之前)。然后我可以将这些数组与“16 字节对齐变量的指令”一起使用。

问题:如果我在另一个 .cpp 文件中使用这个 .cpp 文件作为包含会发生什么?我也可以在其他项目中使用该数组进行对齐操作吗?

问题 2:有捷径吗?我不想把我所有的变量都放在开头。

一些代码:(我处理了一些 16 字节对齐的数组)

    //I put these arrays at the beginning, so they are aligned
//for the movaps instructions(x2 speed for reading and writing memory)
float v1[16];
float v2[16];
char counters[32];
char array_of_ones[32];
char source_array[4096];
char destination_array[4096];   
struct bit_field
{
    bf1:32; 
    bf2:32;
    bf3:32;
    bf4:32;
}some_area;
struct bit_mask_x
{
    bf1:32;
    bf2:32;
    bf3:32;
    bf4:32;
}some_mask;
float var_fast[16];
char alignment_purge[5];    //for the unalignment tests
char unaligned_source_array[4096];
char unaligned_destination_array[4096];



#include <math.h>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
.....
.....

如果我将这个程序包含在另一个这样的程序中会发生什么:

#include <math.h>
#include<my_aligned.h> <-------- or my_aligned.cpp
#include<stdio.h>
#include<time.h>

我必须为此使用 .h 文件吗?

谢谢...

【问题讨论】:

  • #include &lt;iostream.h&gt; 为什么要使用 pre-ansi 标头?
  • 我正在从旧书中学习。我可以更改 iostream.h 吗?
  • @tuğrulbüyükışık 如果你买不起最近的教科书,你最好使用一些免费的在线文本而不是过时的东西。
  • 好的,我删除了那个流。我现在能做什么?

标签: c++ arrays alignment memory-alignment


【解决方案1】:

您是否真正尝试过这是否正确对齐您的变量?编译时,可执行文件总是有一个大小可能不是 16 的倍数的标头。此外,alignment_purge 可能不会真正让其后面的变量不对齐,因为编译器可能会添加填充。最后,标题不会引入变量,因此如果将变量放在标题上方或下方,这不会改变任何内容。

您可以查看this question 了解如何请求对齐的内存。

附带说明一下,通常您不希望将源文件包含到另一个文件中。有关此主题,请参阅 this question

【讨论】:

  • @tuğrulbüyükışık,仅仅因为它可以在您的计算机上使用您的特定编译器运行,并不意味着它是正确的。你可能也很幸运。
【解决方案2】:

将变量声明放在文件的顶部不需要来强制执行任何特定的对齐。您可能只是在这里走运了,或者这可能是您的编译器的特质。

如果您使用 gcc,则可以使用 aligned attribute 请求正确对齐 - 其他编译器可能具有等效扩展名或 #PRAGMAs。

例如。您的带有 gcc 扩展名的变量声明如下所示:

float v1[16] __attribute__ ((aligned (16)));
float v2[16] __attribute__ ((aligned (16)));

如果您需要它完全可移植,我认为您唯一的解决方案是动态分配一大块内存,然后自己管理其中分配的块的对齐方式。


请注意,仅需要在 .cpp 文件中实际存储变量的位置强制执行对齐。您可以在标头中前向声明它们,这样您就可以在其他文件中引用它们。 #includeing .cpp 文件不仅没有必要,而且会导致链接错误,因为每个文件都有自己的同名变量副本。


OP 正在使用 Digital Mars(如果你马上提到这个,我会查一下的)。

搜索数字火星对齐,第一个命中是pragma documentation。我首先查看了align,它把我推荐给了pack

使用它,您的代码将如下所示:

#pragma pack(push, 16)
float v1[16];
float v2[16];
// ... any other aligned variables defined here
#pragma pack(pop)

但是,pack 会影响结构内成员的对齐方式 - 不清楚它对全局变量的作用。

我认为,可以肯定的是,您需要编写一个对齐的分配器:例如,从搜索 _aligned allocation C++` 开始,如果您无法弄清楚,请发布一个专门的问题。

【讨论】:

  • 我希望它能在数字火星上工作。我在其中使用英特尔风格的汇编代码。
猜你喜欢
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
相关资源
最近更新 更多