C++数组的对齐未对齐属性
C++ aligned unaligned property of arrays
编辑:这是我的一个工作项目。加工。我在文件的开头声明了一些字符数组.cpp甚至在 #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 文件吗?
谢谢。。。
您是否实际尝试过这是否正确对齐您的变量?编译时,可执行文件始终有一个标头,其大小可能不是 16 的倍数。此外,alignment_purge
可能不会真正使后面的变量不对齐,因为编译器可能会添加填充。最后,标头不会引入变量,因此,如果您将变量放在标头上方或下方,则不会更改任何内容。
您可以查看此问题以了解如何请求对齐内存。
作为旁注,通常您不希望将源文件包含在另一个文件中。请参阅有关此主题的此问题。
变量声明放在文件顶部不需要强制任何特定的对齐方式。你可能只是在这里很幸运,或者这可能是你的编译器的特质。
如果您使用的是 gcc,则可以使用 align 属性来请求正确的对齐 - 其他编译器可能具有等效的扩展名或 #PRAGMA
s。
例如,带有 gcc 扩展的变量声明如下所示:
float v1[16] __attribute__ ((aligned (16)));
float v2[16] __attribute__ ((aligned (16)));
如果您需要它完全可移植,我认为您唯一的解决方案是动态分配一大块内存,然后自己管理其中分配块的对齐方式。
请注意,只需在变量实际存储的位置(.cpp文件中(强制实施对齐。 您可以在标头中转发声明它们,这将允许您在其他文件中引用它们。 #include
.cpp文件不仅是不必要的,还会导致链接错误,因为每个文件都有自己的同名变量副本。
OP正在使用数字火星(如果你马上提到这一点,我会查一下(。
搜索数字火星对齐,第一个命中是编译指示文档。我先看了看,它让我收拾行李。
使用它,您的代码将如下所示:
#pragma pack(push, 16)
float v1[16];
float v2[16];
// ... any other aligned variables defined here
#pragma pack(pop)
但是,pack 会影响结构内成员的对齐方式 - 不清楚它对全局变量的作用。
我认为,可以肯定的是,您需要编写一个对齐的分配器:例如,首先搜索_aligned分配C++",如果您无法弄清楚,请发布一个专门的问题。
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 对齐和对齐的实际用例C++关键字
- 如何减少代码的运行时间以对齐文本?
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- gcc 中的多个对齐属性是否可以用于保证缓存行分隔?
- 将 C++ 类属性与分号前面的最后一个单词对齐;在 emacs 中
- 跨平台属性对齐
- C++数组的对齐未对齐属性
- GCC/Clang中内存对齐的通用属性