关于实例化一个类的内存占用问题

gzhosp_redAnt 2017-10-21 01:21:43
最近在学习C++动态数组的知识,PPT提出了一个问题,有如下一段代码:

const int INIT_CAPACITY = 1000000;

class Demo {
public:
Demo(); // constructor
string at(int i);
private:
string *bigArray;
};

Demo::Demo()
{
bigArray = new string[INIT_CAPACITY];
for (int i=0;i<INIT_CAPACITY;i++) {
bigArray[i] = "Lalalalalalalalala! ";
}
}

string Demo::at(int i)
{
return bigArray[i];
}


实例化一个Demo实例,我个人计算是需要20MB的内存,20个char类型 x 1MB = 20MB
然而PPT给出的结论是:


个人有疑问 额外的为字符串的30MB用在了哪里 谢谢大神
...全文
492 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-10-24
  • 打赏
  • 举报
回复
《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》
Acuity. 2017-10-24
  • 打赏
  • 举报
回复
C++类占用空间问: 1、一个空类所占的大小的1个字节,这是因为空类也可以实例化,实例在内存得有一个独一无二的地址, 为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址; 2、类所占的大小是其成员的大小(并不是所有成员相加之和,要考虑到字节对齐的问题); 3、普通函数不占内存; 4、虚函数所占的大小为4,虚函数的地址会被存放到虚函数列表里去,所以类所占大小与虚函数的数量无关。
赵4老师 2017-10-23
  • 打赏
  • 举报
回复
一段内存
赵4老师 2017-10-23
  • 打赏
  • 举报
回复
string是对象,不是一端内存。
paschen 版主 2017-10-22
  • 打赏
  • 举报
回复
VS下,sizeof(string)=28,这取决于string的实现,这很正常,因为你除了存储字符串,还需要存管理这些字符串的变量和记录信息的相关变量,当然你可以自己使用一个二级字符指针去管理,这样会比用string占用的空间小很多
大尾巴猫 2017-10-21
  • 打赏
  • 举报
回复
引用 7 楼 redRnt 的回复:
[quote=引用 6 楼 ananluowei 的回复:] 要计算这个Demo实例用了多少内存,要这么做 sizeof(Demo0 + INIT_CAPACITY * sizeof(bigArray[0]) 在我的机器上,sizeof(bigArray[0])是string内字符串的长度+4 理论上应该占用的空间是这么大,但是string内部实现,可能会多申请一些内存,用于string字串的增长,免得每次增长都重新申请新的内存. 这些string内部申请的预留空间,是不能用sizeof得到的,你无法知道具体大小,除非看具体string的源码,不同编译器实现方法不一样,预留的大小也不一样。
恩,我当初根本没考虑sizeof。因为我问的是在堆上申请的空间,按道理是可以算出来的,所以一开始才会算出20MB,就是那莫名奇妙的30MB扰乱了我,尴尬。哈哈[/quote] 指针是指向内存中的一个地址,至于这个地址到底代表多少new出来的空间,你不一定知道的,除非你看到new这条语句。 就像Demo类,里面包含一个指针,你用sizeof不能得到类内部new的空间大小。 同样,string也是这样,不看string具体的源码,不知道string内部new了多少空间 要想自己精确控制内存,就不要用string,用最原始的char字符串,自己new,自己delete。 所谓的精确控制,也是相对的,程序载入运行,代码就占空间,还有线程栈和默认的堆等其他的操作系统帮你载入的东西,都是你自己无法精确控制的。
gzhosp_redAnt 2017-10-21
  • 打赏
  • 举报
回复
好吧 我可能问的不清楚。我问的是,如代码所示我每次实例化一次对象,就会在堆中new一个新的string类的数组,并为每一个数组赋值。然后问每实例化一次对象就会耗费堆中多少的内存?我算的是20MB,不明白剩下的30,尴尬
gzhosp_redAnt 2017-10-21
  • 打赏
  • 举报
回复
引用 6 楼 ananluowei 的回复:
要计算这个Demo实例用了多少内存,要这么做 sizeof(Demo0 + INIT_CAPACITY * sizeof(bigArray[0]) 在我的机器上,sizeof(bigArray[0])是string内字符串的长度+4 理论上应该占用的空间是这么大,但是string内部实现,可能会多申请一些内存,用于string字串的增长,免得每次增长都重新申请新的内存. 这些string内部申请的预留空间,是不能用sizeof得到的,你无法知道具体大小,除非看具体string的源码,不同编译器实现方法不一样,预留的大小也不一样。
恩,我当初根本没考虑sizeof。因为我问的是在堆上申请的空间,按道理是可以算出来的,所以一开始才会算出20MB,就是那莫名奇妙的30MB扰乱了我,尴尬。哈哈
大尾巴猫 2017-10-21
  • 打赏
  • 举报
回复
要计算这个Demo实例用了多少内存,要这么做 sizeof(Demo0 + INIT_CAPACITY * sizeof(bigArray[0]) 在我的机器上,sizeof(bigArray[0])是string内字符串的长度+4 理论上应该占用的空间是这么大,但是string内部实现,可能会多申请一些内存,用于string字串的增长,免得每次增长都重新申请新的内存. 这些string内部申请的预留空间,是不能用sizeof得到的,你无法知道具体大小,除非看具体string的源码,不同编译器实现方法不一样,预留的大小也不一样。
gzhosp_redAnt 2017-10-21
  • 打赏
  • 举报
回复
引用 4 楼 qq_38204686 的回复:
你看到20个字符 并不是只占20个字符 自己用sizeof试一下
我知道,sizeof算的是对象的所占字节,它只有一个指针的大小,是4没错的。如果你新建一个对象demo,但是这个时候你sizeof(demo),是算的这个对象占用的内存,也就是只有bigArray指针的大小。我问的是,如代码所示我每次实例化一次对象,就会在堆中new一个新的string类的数组,并为每一个数组赋值。然后问每实例化一次对象就会耗费堆中多少的内存?我算的是20MB
大米粥哥哥 2017-10-21
  • 打赏
  • 举报
回复
你看到20个字符 并不是只占20个字符 自己用sizeof试一下
大尾巴猫 2017-10-21
  • 打赏
  • 举报
回复
引用 2 楼 redRnt 的回复:
[quote=引用 1 楼 ananluowei 的回复:] string *bigArray; 指针也要占空间 string本身要占用空间,一些用来管理的变量,比如size,坐标等变量,具体多少要看不同的实现 string存储字符串,内部开辟的空间,不一定恰好是字符串的容量,可能会多开一些,用于string中添加内容,不同的编译器也不一样。
那么,再多问一句,就是每创建一个字符串元素,就要30MB的内存,比我们本身建立的一个数组元素还大,这其实合理吗?[/quote]纯字符数组或者字符串肯定是最节省内存的,但是编写处理函数可能代码用的多,用string有些字符串操作容易些,而且也没有内存忘记释放的问题。
gzhosp_redAnt 2017-10-21
  • 打赏
  • 举报
回复
引用 1 楼 ananluowei 的回复:
string *bigArray; 指针也要占空间 string本身要占用空间,一些用来管理的变量,比如size,坐标等变量,具体多少要看不同的实现 string存储字符串,内部开辟的空间,不一定恰好是字符串的容量,可能会多开一些,用于string中添加内容,不同的编译器也不一样。
那么,再多问一句,就是每创建一个字符串元素,就要30MB的内存,比我们本身建立的一个数组元素还大,这其实合理吗?
大尾巴猫 2017-10-21
  • 打赏
  • 举报
回复
string *bigArray; 指针也要占空间 string本身要占用空间,一些用来管理的变量,比如size,坐标等变量,具体多少要看不同的实现 string存储字符串,内部开辟的空间,不一定恰好是字符串的容量,可能会多开一些,用于string中添加内容,不同的编译器也不一样。

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧