有以下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. Java如何获取本地计算机的IP地址和主机名?

    在Java编程中,如何获取本地计算机的IP地址和主机名? 以下示例显示如何使用InetAddress类的getLocalAddress()方法获取系统的本地IP地址和主机名. package com. ...

  2. Linux软件源

    Kali科大软件源: vim /etc/apt/sources.list 下面的粘帖进去. deb http://mirrors.ustc.edu.cn/kali kali main non-free ...

  3. Mybatis(一)走进Mybatis与FisrtExample

    前言 一直在使用,从未系统的总结起来.所以这里给大家带来的是mybatis的总结,系统大家能够对这个框架有一定的系统的学习与认识. mybatis和Hibernate应该是现在主流的ORM框架了. m ...

  4. Java8学习笔记(九)--日期/时间(Date Time)API指南

    Java 8日期/时间( Date/Time)API是开发人员最受追捧的变化之一,Java从一开始就没有对日期时间处理的一致性方法,因此日期/时间API也是除Java核心API以外另一项倍受欢迎的内容 ...

  5. Redis数据库高级实用特性:持久化机制

    Redis数据库高级实用特性:持久化机制 大型web系统数据缓存设计 Redis高级特性:虚拟内存的使用技巧 Redis高级实用特性:安全性与主从复制 Memcached.Redis OR Tair

  6. Git错误:error: The following untracked working tree files would be overwritten by merge:

    [andy@localhost weixin_robot]$ git pull Updating d652d1c..fa05549 error: The following untracked wor ...

  7. [Python] 08 - Classes --> Objects

    故事背景 一.阶级关系 1. Programs are composed of modules.2. Modules contain statements.3. Statements contain ...

  8. vue中引入jquery

    npm install jquery -S 在webpack.base.conf.js里加入 plugins: [ new webpack.optimize.CommonsChunkPlugin('c ...

  9. 修改Ubuntu的aptget源为阿里源的方法

    1.复制原文件备份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 2.编辑源列表文件 sudo vim /etc/apt/sources ...

  10. php MongoDB driver 查询实例

    //是否只查mx $mx_on_switch = I("post.mx_on_switch"); //mx模糊查询 $mx_vague_check = I("post.m ...