C++ 对象占用内存大小的思考
来源:互联网 发布:如何退出手机淘宝账号 编辑:程序博客网 时间:2024/04/29 15:23
一直有这样几个疑问,C++中一个对象占有多大内存?会不是里面的函数越多,占有的内存就越大?
1:空类占有的内存
#pragma once
class TestClass
{
};
结果:sizeof(TestClass) = 1
原因:C++要为每一个类在内存中一个独一无二的地址,所以即便是空类也会被分配1个字节来初
始化,所以空类的占有的字节是1.
结论:空类也要占用一个字节的内存
2:函数占有内对象的内存吗?
#pragma once
class TestClass
{
public:
TestClass(void);
~TestClass(void);
void func();
};
sizeof(TestClass) = 1
原因:我们在进行成员函数的调用如Object.func(),其实是这样的过程--func(Object.this)。函数虽然在内
部声明,但是成员函数的大小不在类的对象里面,而是多个成员对象公用函数,“我们访问类的成员函数是
通过类里面的一个指针实现,而这个指针指向的是一个table,table里面记录的各个成员函数的地址(当然
不同的编译可能略有不同的实现)”(引号里面的话为copy网上的,感觉还是有点问题的,如果类里面有这
样一个指针,岂不是会至少占用四个字节,那么就不会出现空类的大小是1了,应该是直接把Object.func()
翻译成 TestClass::func(Object.this) ).
3:仅有数据成员
#pragma once
class TestClass
{
private:
int b;
};
sizeof(TestClass) = 4
此时类的大小就是其中数据成员的大小
4:字节对齐
#pragma once
class TestClass
{
public:
TestClass(void);
~TestClass(void);
private:
char c;
int b;
};
结果:sizeof(TestClass) = 8
原因:char类型只有1个字节,但是为了提高cpu的计算速度,编译器会将1个字节补成4个字节
5:当有静态变量时候
#pragma once
class TestClass
{
public:
TestClass(void);
~TestClass(void);
private:
char c;
int b;
static int m;
};
结果:sizeof(TestClass) = 8
原因:静态变量不占用类对象的内存
6:当有虚函数
#pragma once
class TestClass
{
public:
TestClass(void);
virtual ~TestClass(void);
private:
char c;
int b;
};
结果:sizeof(TestClass) = 12
原因:此时类对象内部有一个指向虚函数表的指针,这个指针会占用4个字节的内存。
参考资料:
http://www.tuicool.com/articles/uiUJry
1:空类占有的内存
#pragma once
class TestClass
{
};
结果:sizeof(TestClass) = 1
原因:C++要为每一个类在内存中一个独一无二的地址,所以即便是空类也会被分配1个字节来初
始化,所以空类的占有的字节是1.
结论:空类也要占用一个字节的内存
2:函数占有内对象的内存吗?
#pragma once
class TestClass
{
public:
TestClass(void);
~TestClass(void);
void func();
};
sizeof(TestClass) = 1
原因:我们在进行成员函数的调用如Object.func(),其实是这样的过程--func(Object.this)。函数虽然在内
部声明,但是成员函数的大小不在类的对象里面,而是多个成员对象公用函数,“我们访问类的成员函数是
通过类里面的一个指针实现,而这个指针指向的是一个table,table里面记录的各个成员函数的地址(当然
不同的编译可能略有不同的实现)”(引号里面的话为copy网上的,感觉还是有点问题的,如果类里面有这
样一个指针,岂不是会至少占用四个字节,那么就不会出现空类的大小是1了,应该是直接把Object.func()
翻译成 TestClass::func(Object.this) ).
3:仅有数据成员
#pragma once
class TestClass
{
private:
int b;
};
sizeof(TestClass) = 4
此时类的大小就是其中数据成员的大小
4:字节对齐
#pragma once
class TestClass
{
public:
TestClass(void);
~TestClass(void);
private:
char c;
int b;
};
结果:sizeof(TestClass) = 8
原因:char类型只有1个字节,但是为了提高cpu的计算速度,编译器会将1个字节补成4个字节
5:当有静态变量时候
#pragma once
class TestClass
{
public:
TestClass(void);
~TestClass(void);
private:
char c;
int b;
static int m;
};
结果:sizeof(TestClass) = 8
原因:静态变量不占用类对象的内存
6:当有虚函数
#pragma once
class TestClass
{
public:
TestClass(void);
virtual ~TestClass(void);
private:
char c;
int b;
};
结果:sizeof(TestClass) = 12
原因:此时类对象内部有一个指向虚函数表的指针,这个指针会占用4个字节的内存。
参考资料:
http://www.tuicool.com/articles/uiUJry
0 0
- C++ 对象占用内存大小的思考
- Java对象占用内存大小
- Java对象占用内存大小
- 类的占用内存大小
- 告诉你一个java对象占用的内存大小的方法
- 精确计算一个Java对象占用的内存大小
- java中获取对象所占用的内存大小
- C/C++中不同数据类型所占用的内存大小
- C/C++中不同数据类型所占用的内存大小
- C/C++中结构体占用内存大小的计算方法
- 计算占用内存大小的方法
- 查看进程占用的内存大小
- 结构体占用的内存大小
- java计算内存大小 java计算对象占用内存大小
- java对象占用内存大小计算方式
- 计算对象占用内存大小工具类
- C++primer 5.8sizeof 操作符--上(不同类型所占用的内存大小字节)
- PHP数组实际占用内存大小的分析
- Java知识点总结——装箱与拆箱
- 虽然用了好几年的CSDN了,却是第一次在这上面写博客
- C语言二叉排序树单词计数程序实现
- 八中oj——2176【NOI2001】聪明的打字员 代码
- 鼠标右键怎么清除Catalyst Control Center
- C++ 对象占用内存大小的思考
- 杭电1527
- POJ 1222 高斯消元法
- ZOJ 3213
- Python3.4 asyncio模块简介
- Merge Sorted Array 合并两个有序数组
- C++中函数返回引用
- R 中计算数据框中相同ID的均值 标准差 和删除行(记录或者观测)中重复的数据
- netbeans composer