美文网首页C++复习
C++预处理器及pragma pack(n)的理解

C++预处理器及pragma pack(n)的理解

作者: 凉拌姨妈好吃 | 来源:发表于2018-05-03 22:45 被阅读3次
编译器编译时发现了头文件重复包含的问题,如何解决?
  1. 使用#ifndef
  2. 使用#pragma once
 方式一:  
  #ifndef __SOMEFILE_H__  
  #define __SOMEFILE_H__  
  ... ... // 声明、定义语句  
  #endif  
  方式二:  
  #pragma once  
  ... ... // 声明、定义语句  
#pragma pack(n)

在了解它之前,我们先来搞懂结构体的存储方式

//假设定义了一个这样的结构体s
struct s {
char ch;
int i;
};

此时我们使用sizeof输出结构体的大小,猜猜会是多少?
char是1个字节、int是4个字节
那么按照我们的设想,应该输出5,但是编译器却输出了8
这是为什么?
编译器为了让程序跑得更快,减少CPU读取数据的指令周期,对结构体的存储进行优化。本来char是1字节,但是这里为了使int成员的地址能够被4整除,所以将char也变为了4字节。

如果此时我们使用了pragma pack(1)对它进行限定

那么#pragma pack(1)代表了数据在内存中的对齐数据为1,那么编译器就会将结构体强制连续排列。此时输出结构体的大小,就是5.

相关文章

网友评论

    本文标题:C++预处理器及pragma pack(n)的理解

    本文链接:https://www.haomeiwen.com/subject/tjzlrftx.html