#include
using namespace std;
int main(){
class S{};
cout<<sizeof(S);
return 0;
}
程序居然输出为1!到底是怎么回事?首先我在这里要声明一点——类在未初始化之前确实不会分配空间,这里探讨的是sizeof(类)的问题,详细情况看下面的例子
C++中的类所占内存空间总结
类所占内存的大小是由成员...
分类:
编程语言 时间:
2015-04-22 11:38:05
阅读次数:
157
内存对齐,因为它是对C/C++程序员透明的,在很多C,C++课本中也没有讲清楚,所以今天写了这篇博客,讲述为什么需要内存对齐,内存对齐怎么计算·····...
分类:
编程语言 时间:
2015-04-17 11:42:10
阅读次数:
134
一、内存对齐的原因根本原因:cpu是根据内存访问粒度(memory access granularity,下文简写成MAG)来读取内存,MAG就是cpu一次内存访问操作的数据量,具体数值依赖于特定的平台,一般是2byte、4byte、8byte。内存对齐:更够减少内存读取次数(相对于内存不对齐),为...
分类:
其他好文 时间:
2015-04-15 00:38:02
阅读次数:
148
Data Structure Alignment 2
在前面的一篇文章中,似乎明白了结构体对齐的基本规则,但是有些地方还是含糊不清。比如看下面的这个程序。
根据前面的规则很容易算出,sizeof(A)=16, sizeof(B)=24.但是在GCC下运行的结果却不是这样,所以一时有点不知问题所起,内存对齐都是编译器做的工作
所以各个平台下面的实现没有得到统一规范,虽然可以#pragma...
分类:
其他好文 时间:
2015-04-08 15:03:17
阅读次数:
128
首先我们先看看下面的C语言的结构体:[cpp]view plaincopytypedefstructMemAlign{inta;charb[3];intc;}MemAlign;以上这个结构体占用内存多少空间呢?也许你会说,这个简单,计算每个类型的大小,将它们相加就行了,以32为平台为例,int类型占...
分类:
其他好文 时间:
2015-04-04 15:08:56
阅读次数:
187
现代计算机的内存空间是以Byte为单位划分的,理论上对内存中数据的访问可以从任何地址开始,但实际上对特定类型变量的访问经常是在特定的地址开始。为了达到这个目的,就需要各类型的数据按照一定的规则在内存空间上排列,这即为内存对齐(Memory Alignment)。对以下两个例子:struct A { ...
分类:
其他好文 时间:
2015-03-22 06:52:57
阅读次数:
113
关于内存对齐
一:
1.什么是内存对齐
假设我们同时声明两个变量:
char a;
short b;
用&(取地址符号)观察变量a,
b的地址的话,我们会发现(以16位CPU为例):
如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004。
那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了?答案就是它确实没被使用。因为C...
分类:
其他好文 时间:
2015-03-22 00:28:56
阅读次数:
115
看了好多次,感觉这一次才算是真正理解了#pragma pack(4)//可手动指定对齐值typedef struct DDD{ char a;//1 起始位置可为1,2,3,4,5……. 这个放在位置1 short b;//2起始位置可为1,2,4,6,8….. 这个需要放在位置2,故之前补1 i....
分类:
其他好文 时间:
2015-03-18 13:55:47
阅读次数:
110
1、内存对齐原因平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次...
分类:
其他好文 时间:
2015-03-17 23:18:50
阅读次数:
194
1 #include 2 3 #pragma pack(4) 4 5 struct A{ 6 A() {} 7 ~A() {} 8 int m1; // 4 字节 9 int m2; // 4 字节10 };11 struct B:A{12 B() ...
分类:
编程语言 时间:
2015-03-17 00:37:06
阅读次数:
216