C++类空间大小关于内存对齐的学习
来源:互联网 发布:dns污染 知乎 编辑:程序博客网 时间:2024/05/01 00:30
1.空类空间大小为1,为什么,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以空类所占的内存大小是1个字节。
2.类空间内存大小计算
摘自http://www.jb51.net/article/45406.htm
从结构体的首地址开始向后依次为每个成员寻找第一个满足条件的首地址x,该条件是x % N = 0,并且整个结构的长度必须为各个成员所使用的对齐参数中最大的那个值的最小整数倍,不够就补空字节。
即类空间大小是成员中内存最大值的最小整数倍(这个值大于等于所有成员内存和),这里所说的成员内存最大值是针对基础类型而言的,这里记为MAX,(http://blog.csdn.net/lyl0625/article/details/7350045),根据类成员顺序依次寻址,寻址时按实际的成员内存大小(基础类型大小)依次往后,以一个MAX为一段内存,如果新寻址的内存超过了边界,那就新增一个MAX内存,从新增的MAX首地址开始存放。如下:
class test
{
public:
test()
{
cout<<"test len:"<<sizeof(test)<<" test addr:"<<(int)this<<" a:"<<(int)&a<<" b:"<<(int)&b<<" c:"<<(int)&c<<endl;
}
private:
int a;
double b;
char c;
};
结果:test len:24 test addr:2686720 a:2686720 b:2686728 c:2686736
3.由于内存对齐对类空间大小的影响,所以我们在摆放类成员时,最好能根据成员内存大小有序的摆放;如下
代码一
class test
{
public:
test()
{
cout<<"test len:"<<sizeof(test)<<endl;
}
private:
int a;
int b;
char c;
char d;
};
输出结果长度是12;
代码二
class test
{
public:
test()
{
cout<<"test len:"<<sizeof(test)<<endl;
}
private:
int a;
char d;
int b;
char c;
};
输出结果长度为16;
- C++类空间大小关于内存对齐的学习
- 关于C语言 内存对齐的问题
- 转:struct 关于sizeof的大小-内存对齐问题
- 关于结构体的大小(内存对齐)
- 关于内存对齐的学习笔记
- 关于内存对齐的学习笔记
- 关于C++测试类大小中的内存对齐
- c语言内存对齐的学习
- 关于大小端、内存对齐 转
- C-内存地址对齐及大小端
- 关于C语言内存对齐
- struct对象在内存中所占的空间大小(内存对齐)
- sizeof详解、类的大小、内存对齐、位域
- C++ 类的大小 struct/class内存对齐问题
- C++类的内存对齐-C++alignment
- 关于C语言中数据结构的内存对齐问题
- 关于gcc中内存对齐的c写法(attribute)
- 关于c语言内存地址对齐的一点思考
- 在map中根据value获取key
- 4-3安全性
- 学会说不
- 4-4嵌入式SQL
- SVG基础以及使用Javascript DOM操作SVG
- C++类空间大小关于内存对齐的学习
- 4-5过程化SQL
- 4-6事务管理
- 基于Docker实现DevOps的一些探索
- AngularJS 精妙绝伦的控制器
- 5-1规范化
- linux工作项
- 保留三位小数之妙
- 5-2数据库设计