Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 吊舱类型是否始终对齐?_C++_C_Visual C++ - Fatal编程技术网

C++ 吊舱类型是否始终对齐?

C++ 吊舱类型是否始终对齐?,c++,c,visual-c++,C++,C,Visual C++,例如,如果我声明一个长变量,我是否可以假设它总是在“sizeof(long)”边界上对齐?微软Visual C++在线帮助这样说,但它是标准行为吗? 更多信息: a。可以明确创建未对齐的整数(*条): 查富[5] int*bar=(int*)(&foo[1]) b。显然,#pragma pack()只影响结构、类和联合 c。MSVC文档说明POD类型与它们各自的大小对齐(但它始终是默认的还是默认的,这是标准行为,我不知道)是的,所有类型都始终至少与它们的对齐要求对齐 不然怎么可能呢 但是请注意,

例如,如果我声明一个长变量,我是否可以假设它总是在“sizeof(long)”边界上对齐?微软Visual C++在线帮助这样说,但它是标准行为吗? 更多信息:

a。可以明确创建未对齐的整数(*条):

查富[5]

int*bar=(int*)(&foo[1])

b。显然,#pragma pack()只影响结构、类和联合


c。MSVC文档说明POD类型与它们各自的大小对齐(但它始终是默认的还是默认的,这是标准行为,我不知道)

是的,所有类型都始终至少与它们的对齐要求对齐

不然怎么可能呢

但是请注意,sizeof()类型与其对齐方式不同

可以使用以下宏确定类型的对齐要求:

#define ALIGNMENT_OF( t ) offsetof( struct { char x; t test; }, test )

默认情况下,是的。但是,它可以通过pack()#pragma进行更改


<> P>我不相信C++标准在这方面有任何要求,并把它留给实现。

取决于编译器、语用和优化级别。使用现代编译器,您还可以选择时间或空间优化,这也可能会改变类型的对齐方式。

一般来说,这是因为通过这种方式读/写类型更快。但是几乎每一个编译器都有一个开关来关闭它。在gcc中,its-恶意-???。对于聚合,它们通常根据其中每个元素的对齐要求进行对齐和大小调整。

正如其他人所提到的,这不是标准的一部分,由编译器根据其认为适合处理器的情况来实现。例如,VC可以轻松地为ARM处理器实现与x86处理器不同的对齐要求

Microsoft VC实现了基本上被称为自然对齐的功能,其大小由#pragma pack指令或/Zp命令行选项指定。这意味着,例如,任何大小小于或等于8字节的POD类型都将根据其大小进行对齐。任何较大的内容都将在8字节边界上对齐

如果控制不同处理器和不同编译器的对齐非常重要,则可以使用1的打包大小并填充结构

#pragma pack(push)
#pragma pack(1)    
struct Example
{
   short data1;     // offset 0
   short padding1;  // offset 2
   long data2;      // offset 4
};
#pragma pack(pop)
在此代码中,
padding1
变量的存在只是为了确保数据2自然对齐

对a的答复:


是的,这很容易导致数据不对齐。在x86处理器上,这一点也不会造成多大伤害。在其他处理器上,这可能导致崩溃或执行非常缓慢。例如,Alpha处理器将抛出一个处理器异常,该异常将被操作系统捕获。然后,操作系统将检查指令,然后执行处理未对齐数据所需的工作。然后继续执行。“代码”>“未对齐”/COD>关键字可用于VC中标记非x86程序(即CE)的未对齐访问。

< P> C和C++不强制任何类型的对齐。但是x86非常喜欢自然对齐,大多数其他CPU体系结构都需要自然对齐,编译器通常会尽最大努力让CPU满意。因此,在实践中,除非您真正扭转编译器的手臂,否则您不会看到编译器生成未对齐的数据。

然而,在英特尔x86系列中,对齐“要求”只是一个字节地址。哦,是的,我忘了打包选项/pragmas。它也可以通过项目/编译器选项进行设置。