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

C++ C++;数组的对齐-未对齐属性,c++,arrays,alignment,memory-alignment,C++,Arrays,Alignment,Memory Alignment,编辑:这是我的一个工作项目。工作 我在.cpp文件的开头声明了一些字符数组(甚至在#include parts之前)。然后我可以将这些数组与“16字节对齐变量的指令”一起使用 问题:如果我在另一个.cpp文件中使用这个.cpp文件作为包含,会发生什么?我可以在其他项目中也使用该阵列进行对齐操作吗 问题2:这有捷径吗?我不想把所有变量都放在开头 一些代码:(我在一些16字节对齐的数组上工作) //我将这些数组放在开头,因此它们是对齐的 //用于movaps指令(读取和写入内存的x2速度) 浮动v1

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

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

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

一些代码:(我在一些16字节对齐的数组上工作)

//我将这些数组放在开头,因此它们是对齐的
//用于movaps指令(读取和写入内存的x2速度)
浮动v1[16];
浮动v2[16];
字符计数器[32];
字符数组_of_one[32];
字符源_数组[4096];
字符目的地_数组[4096];
结构位\字段
{
bf1:32;
bf2:32;
bf3:32;
bf4:32;
}部分地区;
结构位掩码
{
bf1:32;
bf2:32;
bf3:32;
bf4:32;
}一些口罩;
浮动var_fast[16];
字符对齐与清除[5]//对于不对齐测试
字符未对齐的_源_数组[4096];
字符未对齐的_目标_数组[4096];
#包括
#包括
#包括
#包括
.....
.....
如果我将此程序包含在另一个类似的程序中,会发生什么情况:

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

#include将变量声明放在文件顶部不需要强制执行任何特定对齐。您可能只是在这里运气好,或者这可能是您的编译器的一个特点

如果您使用的是gcc,那么可以使用aligned来请求正确的对齐-其他编译器可能具有等效的扩展名或
#PRAGMA
s

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

float v1[16] __attribute__ ((aligned (16)));
float v2[16] __attribute__ ((aligned (16)));
#pragma pack(push, 16)
float v1[16];
float v2[16];
// ... any other aligned variables defined here
#pragma pack(pop)
如果您需要它完全可移植,我认为您唯一的解决方案是动态分配一大块内存,然后自己管理其中分配的块的对齐


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


OP使用的是数字火星(如果你马上提到这一点,我会查一下)

在寻找火星数字校准时,第一个目标是火星。我先看了看,它指的是我

使用此选项,您的代码将如下所示:

float v1[16] __attribute__ ((aligned (16)));
float v2[16] __attribute__ ((aligned (16)));
#pragma pack(push, 16)
float v1[16];
float v2[16];
// ... any other aligned variables defined here
#pragma pack(pop)
但是,pack会影响结构内部成员的对齐方式——不清楚它对全局变量的作用


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

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

您可以查看以了解如何请求对齐内存


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

#包括
为什么要使用ansi之前的标题?我正在从旧书中学习。我能用什么来改变iostream.h?@tuğrulbüyükıkık如果你买不起最近的教科书,你最好使用一些免费的在线文本,而不是过时的。好吧,我删除了那个流。我现在能做什么?@tuğrulbüyükıkı351; k,仅仅因为它在你的计算机上工作,使用你特定的编译器,并不意味着它是正确的。你可能很幸运。我希望它能在数字火星上工作。我正在使用英特尔风格的汇编代码。