C ++对齐数组的未对齐属性

时间:2012-07-25 08:27:55

标签: c++ arrays alignment memory-alignment

编辑:这是来自我的一个工作项目。工作。 我在.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文件吗?

...谢谢

2 个答案:

答案 0 :(得分:1)

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

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

作为旁注,通常您不希望将源文件包含到另一个文件中。有关此主题,请参阅this question

答案 1 :(得分:0)

将变量声明放在文件的顶部,以强制执行任何特定的对齐。你可能只是在这里变得幸运,或者它可能是你的编译器的特质。

如果你正在使用gcc,你可以使用 aligned attribute来请求正确的对齐 - 其他编译器可能有相同的扩展名或#PRAGMA s。

例如。使用gcc扩展名的变量声明如下所示:

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

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


请注意,只需要在.cpp文件中实际存储变量的位置强制执行。您可以直接在标题中声明它们,这样您就可以在其他文件中引用它们。 {。}} .cpp文件#include不仅是不必要的,它会导致链接错误,因为每个文件都有自己的具有相同名称的变量副本。


OP正在使用数字火星(如果你马上就提到过,我会查一下)。

搜索数字火星对齐,第一次点击是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 ++来开始,如果你想不出来就发布一个专门的问题。