C++复习

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

2018-05-03  本文已影响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.

上一篇下一篇

猜你喜欢

热点阅读