有以下C++类

#pragma pack(push)
#pragma pack(1)
class task /*:public OSThread*/{
//public:
// void Entry();
//private:
// int a;
// int b;
};
#pragma pack(pop)

sizeof(task) =1 去掉一字节对齐,sizeof(task)=1 ,所以说即使是一个空的类也会占用一个1字节,也必须占,如果不存在内存,那么这类就不存在了,也就无法实例化这个类了。

添加一个成员变量 sizeof的值

class task /*:public OSThread*/{
//public:
// void Entry();
//private:
int a;
// int b;
};
sizeof(task) =

占用4个字节,int占用4个字节,并不是4+1字节,理解:类必须存在内存中,而int a占用的地址足以表达类存放的地址(验证),所以表示1个字节的已经被优化掉,不需要!

其实该类的首地址就是int a地址了。

//验证
task* t;
t= new task();
t->a = ; std::cout<< std::hex << t << std::endl;
std::cout<< std::hex << &(t->a) << std::endl;
//两个输出相同的

推广一下到类的成员方法

class task/*:public OSThread*/{
public:
task(){};
// void Entry();
void my_test(void){
std::cout<< a <<std::endl;
}
//private:
int a;
int b; // int b;
};
typedef void (task::*func)(void); //类成员函数指针
typedef void (*func1)(void); //普通函数指针 long l_func_addr;
void* funcAddr;
func t_func;
task* t;
t= new task();
t->a = ;
t_func = &task::my_test; //类方法地址
funcAddr = (void*&)(t_func); //强制转换
func1 func= reinterpret_cast<func1>(funcAddr); //强制转换
func(); //输出 3
l_func_addr = (long)func;
//输出类方法的地址,可见类方法的地址并不会成为类的首地址,类的方法地址是动态分配
std::cout<<std::hex << l_func_addr<< std::endl;
std::cout<<std::hex<<t_func<<std::endl;
//printf可以输出地址和 l_func_addr一样
printf("0x%x\n",t_func); //
l_func_addr = (long)t;
std::cout<< std::hex << l_func_addr << std::endl;
(t->*t_func)();
std::cout<< std::hex << l_func_addr << std::endl;
//t的值和&(t->a)值一致,&(t->a) 与&(t->b)相差4个byte!
std::cout<< std::hex << t << std::endl;
std::cout<< std::hex << &(t->a) << std::endl;
std::cout<< std::hex << &(t->b) << std::endl;

总结:空类必然占用1byte的空间(标识类,类地址),类方法成员不在sizeof(类名)的计算内。类的成员变量会在sizeof在内,static修饰的也不在sizeof范围内。

C++的类大小的更多相关文章

  1. C++类大小

    对于C++中类的大小,主要针对于无成员的空类大小,编译器会对该类进行优化,情况主要分为是否有虚表(虚函数)两种类型,对于无虚函数的类,该类大小均为1个字节(编译器插入一个char表示该类的存在),而出 ...

  2. c++类大小问题

    1.空类 class A { }; 解析:类的实例化就是为每个实例在内存中分配一块地址:每个类在内存中都有唯一的标识,因此空类被实例化时,编译器会隐含地为其添加一个字节,以作区分. 2.虚函数类 cl ...

  3. C++类大小的计算

    这里记录一下怎么计算类对象的大小. 大概总结下,类的大小需要考虑以下内容: 非静态成员变量大小 数据对齐到多少位 有无虚函数(即需不需要指向虚函数表的指针,如果考虑继承的情况,则还需要看继承了多少个指 ...

  4. 【整理】C++虚函数及其继承、虚继承类大小

    参考文章: http://blog.chinaunix.net/uid-25132162-id-1564955.html http://blog.csdn.net/haoel/article/deta ...

  5. sizeof操作符-结构体与类大小

    导读 sizeof是C/C++一个难点,当在自定义类上应用sizeof操作符时,总会出现意想不到的结果,下面,我们就来探讨一下sizeof这个操作符! 目录 1. sizeof与strlen的区别 2 ...

  6. C++空类大小

    class a {};class b{};class c:public a{ virtual void fun()=0;};class d:public b,public c{}; 类a,b明明是空类 ...

  7. 由于jsp include 很多文件后导致java类大小超过65535 bytes 的解决方法(转载)

    昨天,我遇到了一個讓我很頭疼的問題. 我做了一個共通的jsp,單只測它是ok的,可是,放在別的jsp中include它,就會報錯如標題所示:The code of method _jspService ...

  8. 类的大小——sizeof 的研究

    类的大小——sizeof 的研究(1) 先看一个空的类占多少空间? class Base { public: Base(); ~Base(); }; 注意到我这里显示声明了构造跟析构,但是sizeof ...

  9. C++类对象大小的计算

    (一)常规类大小计算 C++类对象计算需要考虑很多东西,如成员变量大小,内存对齐,是否有虚函数,是否有虚继承等.接下来,我将对此举例说明. 以下内存测试环境为Win7+VS2012,操作系统为32位 ...

随机推荐

  1. PHP最全笔记(五)(值得收藏,不时翻看一下)

    // 删除 方法1:将其值设置为空字符串 setcookie('user[name]', ''); 方法2:将目标cookie设为“已过期”状态. //将cookie的生存时间设置为过期,则生存期限与 ...

  2. linux手动安装sbt过程

    ubuntu14 手动安装sbt 参见官网配置说明http://www.scala-sbt.org/release/tutorial/Manual-Installation.html 1.下载sbt通 ...

  3. Apache Nginx URL 地址 重写

    URL重写这东西在工作中用了很多次了,但每次都忘记了要记得把知道的积累下来. 哎,要么认为没必要,要么就是没时间?! 一.Apache 篇 官方地址:http://man.chinaunix.net/ ...

  4. 【代码审计】QYKCMS_v4.3.2 前台存储型XSS跨站脚本漏洞分析

      0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...

  5. OSG使用模板缓存

    参考帖子: https://blog.csdn.net/csxiaoshui/article/details/23457273 osg::Geometry *lineStripGeometry = n ...

  6. 试一下Markdown

    Markdown 没想到博客园居然能够有markdown这样的写法了,以前觉得有自定义CSS已经非常不错了,现在居然加入Markdown,太值得称赞了.国内的博客系统,应该首屈一指了. 强调 你要走, ...

  7. GDI+绘制五星红旗

    五星红旗是由红色背景,加5个黄色五角星组成.绘制一个五星红旗的思路,就是先定义一个五角星的自定义控件,然后通过设置五角星的大小.位置.旋转角度等属性,组合成一个五星红旗. 五角星自定义控件代码: pu ...

  8. spring框架排错

    1.格式错误. http://www.springframework.org/schema/mvc       http://www.springframework.org/schema/mvc/sp ...

  9. 学习markdown语法

    12.内部跳转 [这是一个按钮](#测试标题) - 1 - 1 - 1 # 测试标题 这是一个按钮 1 1 1 测试标题 注:使用-代替空格

  10. 学习vue 2.x源码笔记

    1.响应式原理: 核心:Object.defineProperty,用法如下: var obj1 = {}; var initValue = 'hello'; Object.definePropert ...