SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

MSC、GCC、LLVM

查看数: 6552 | 评论数: 2 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2016-5-13 23:11

正文摘要:

本帖最后由 ancientcc 于 2020-7-26 10:54 编辑 虽然MSC和GCC同是C/C++编译器,但怎么说还是存在些差别,要让代码能被MSC和GCC成功编译,在写时就要注意些细节。 定义嵌套STL类型,右侧要用“> >”而不是“>>” ...

回复

ancientcc 发表于 2020-11-29 11:56:14

类成员函数是否占用数据区内存

C++引入类,当遇到内存紧张时程序员会想法降低内存消耗。这时可能会想到去优化那些单元是class的数组变量,把class换成传统C中的struct,成员函数则提取出来变成全局函数。——以上优化依据是认为编译器处理class成员函数是每个对象一个复制,试图减少成员函数占用内存。

这种认识是错误的,类成员函数不会占用数据区内存。以下是实验(基于visutal studio .net 2008)。
  1. class node
  2. {
  3.         int movement_left, move_cost, turns_left;
  4.         map_location prev, curr;
  5.         unsigned in;

  6.         node(int moves, int cost, int turns, const map_location &p, const map_location &c) {...}
  7.         node() {...}
  8.         bool operator<(const node& o) const { ... }
  9. };
  10. node n, n2[2];
复制代码
node是一个类,sizeof(n)值是32,sizeof(n2)值是64。prev、curr各占8字节,movement_left、move_cost、turns_left、int各占4字节,因而总合是32字节。由此已经可以看出三个成员函数没有产生内存。

为进一步验证结论,让给这个类增加成员变量、成员函数,看sizeof(n)、sizeof(n2)返回值。
sizeof(n)sizeof(n2)
增加一个int成员变量3672
增加一个空函数(注1)3264
增加一个非空函数3264
增加两个函数3264
增加一个静态函数3264

注1:空函数指的是存在执行体,但执行体是空的函数。


  • 类中成员函数不会占用类在数据区内存。猜想:类中函数被放在代码区,全系统只存在一份。
  • 类对象占用内存不多于传统C中的struct变量。
  • 一个程序被操作系统运行时,它占用内存分代码区、数据区;类成员函数被放在代码区,类成员变量被放在数据区。
ancientcc 发表于 2020-11-29 11:55:40

基类、派生类

  1. class tfilter_
  2. {
  3.         ......
  4.         virtual void update_to_special();
  5.         ......
  6. };

  7. class tfilter : public tfilter_
  8. {
  9.         ......
  10.         tfilter(const tfilter& that);
  11.         tfilter& operator=(const tfilter& that);

  12.         void update_to_special();
  13.         ......
  14. };
  15. tfilter filter;
复制代码
tfilter是tfilter_的派生类,并重载了成员函数“update_to_special()”,“operator=”操作。

要求当派生类重载了基类一函数时,派类生如何直接调用基类函数
  1. filter.tfilter_::from_ui_special();
复制代码
要求重载的“operator=”操作中如何给基类成员赋值
  1. tfilter& tfilter::operator=(const tfilter& that)
  2. {
  3.         tfilter_::operator=(that);
  4.         ......
  5. }
复制代码
何时会调用“复制型构造函数”、“operator=”操作
在一些地方,“复制型构造函数”和“operator=”是能替换对方,但为安全,须同时实现这两个函数
  1. std::vector<tfilter> filters;
复制代码
复制型构造函数
当要把一个非“空”tfilter对象赋给一个不存在的tfilter对像时。
  1. std::vector<tfilter> filters;
  2. filters.push_back(filter1);
复制代码
filter1是个非空tfilter对象,push_back会向filters新增一个单元,这时会调用tfilter的“复制型构造函数”。

“operator=”操作
当要把一个非“空”tfilter对象赋给已存在的tfilter对象时。
  1. std::vector<tfilter> filters;
  2. filters.erase(filters.begin());
复制代码
filters中有多个单元,当第一个被析构后,余下的就会被调用tfilter的“operator=”操作。

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 04:11 , Processed in 0.067809 second(s), 24 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表