问题:如果我在另一个.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文件吗?
...谢谢
答案 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
不仅是不必要的,它会导致链接错误,因为每个文件都有自己的具有相同名称的变量副本。
搜索数字火星对齐,第一次点击是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 ++来开始,如果你想不出来就发布一个专门的问题。