有以下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. R语言reads.table 自动将字符串变成了逻辑值

    今天遇到了一个问题,文件中有一列的值为全为F, 用read.table 读取的时候,自动将F 变成了false 对于这样的转换,可以通过 colClass 参数控制 colClass 参数指定每一列的 ...

  2. python对象池模式

    class QueueObject(): def __init__(self, queue, auto_get=False): self._queue = queue self.object = se ...

  3. 解决Maven build 慢的问题

    extends:http://www.cnblogs.com/gmq-sh/p/4742698.html ,http://www.cnblogs.com/rainy-shurun/p/5726758. ...

  4. node_readline (逐行读取)

    node官方文档 用于逐行读取文件流, 和终端交互 读取文件流 const fs = require('fs'); const readline = require('readline'); var ...

  5. ajax传输中文参数乱码,本地使用tomcat不乱码,liunx+weblogic乱码

    公司项目有个问题,ajax请求含中文,无论是post方式还是get方式.本地使用tomcat不乱码,liunx+weblogic都乱码.并且用以往encodeURIComponent()并在后台解码之 ...

  6. tomcat启动项目报错:The specified JRE installation does not exist

    在Build Path里设置好jre和各Library的顺序,代码无报错,启动时弹框,里面的信息是:The specified JRE installation does not exist. 后来想 ...

  7. VS没办法调试,直接退出,报错:1. 使用调试生成配置或禁用调试选项“启用‘仅我的代码’”。。。

    打开一个Demo,结果没办法调试,运行出错,直接退出了, 明明加了断点的. 输出→调试→提示信息如下 . 使用调试生成配置或禁用调试选项“启用‘仅我的代码’”. . 检查调试选项下的“符号”设置.线程 ...

  8. 在eclipse中导入hadoop jar包,和必要时导入源码包。

    1. 解药hadoop包 1, C:\hadoop-2.7.2\share\hadoop  提取出所有的 jar 包, 到 _lib 文件夹下 2,将有含有source 名称的jar包 剪切出来 3, ...

  9. HDU 1002 - A + B Problem II - [高精度]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002 Problem DescriptionI have a very simple problem ...

  10. 【待补】splay 模板

    #define _CRT_SECURE_NO_WARNINGS #include<cmath> #include<iostream> #include<stdio.h&g ...