编译器之WIN64预定义宏和数据对齐设置对结构体大小的影响

Posted unclerunning

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译器之WIN64预定义宏和数据对齐设置对结构体大小的影响相关的知识,希望对你有一定的参考价值。

编译器之WIN64预定义宏和数据对齐设置对结构体大小的影响

Reference:

关于VC预定义常量_WIN32,WIN32,_WIN64

1.WIN64

为了增加代码的可移植性,通常都会利用预定义宏WIN64来设置变量的数据位数。

2.数据对齐设置

编译器的数据对齐方式也是可以配置的,64位下VS默认的对齐设置是8Byte。

3.重点

其实通常情况下我们不用理会这些设置。不过,在使用到第三方编译好的库的时候就需要特别留意啦。通常这些不经意的设置很可能导致对结构体的使用出现错误。例如别人编译过的库是4字节对齐的,而你的项目却使用8字节对齐,这样,在你用别人提供的头文件中定义的结构体时就会出现问题。为什么呢?因为你的编译器是按8字节对齐的方式来解释这个结构体的。当然,如果只是在自己写的源代码中使用这个结构体自然是不存在问题的,但你之所以要用这个第三方编译好的库是因为你想要调用它提供的函数来完成一定的任务,这里就有问题了。第三方编译好的库既然已经编译好了,那么其二进制代码中对这个结构体各个成员的偏移量也就确定了,而这个偏移量是编译器基于它被编译时的设置所确定下来的,是4字节对齐的。而你的工程是8字节对齐的,如此,在库的内部对从你的代码中传入的结构体的使用就会对应不上。

以上是关于编译器之WIN64预定义宏和数据对齐设置对结构体大小的影响的主要内容,如果未能解决你的问题,请参考以下文章

零基础入门之结构体字节对齐

C++ 内存对齐

Visual Studio2008 C++结构体成员需要内存对齐吗?

KEIL编译器预处理器和预定义宏(include,ifdef,def等)

面向对象基础知识之文件加密解密

内存对齐:C/C++编程中的重要性和技巧