C++ sizeof的各种

news2024/11/24 17:22:34

C++ sizeof的各种

  • 1. 含有虚函数的类对象的空间大小
  • 2. 虚拟继承的类对象的空间大小
  • 3. 普通变量所占空间大小
  • 4. 复合数据类型(结构体和类)
  • 5. 数组
  • 6. 类型别名
  • 7. 动态分配内存
  • 8. 指针
  • 9. 静态变量
  • 10. 联合体
  • 11. 结构体使用#program pack

1. 含有虚函数的类对象的空间大小

在C++中,含有虚函数的类对象的大小不仅包括其成员变量的大小,还包括一个指向虚函数表(vtable)的指针的大小。这个指针用于动态绑定函数调用。在32位系统中,这个指针通常是4字节,在64位系统中则是8字节。

#include <iostream>

class Base {
public:
    virtual void func() {} //32:4字节,64:8字节
};

class Derived : public Base {
    int a; //4
    double b; //8
};

int main() {
    std::cout << "Size of Base: " << sizeof(Base) << std::endl; // 8
    std::cout << "Size of Derived: " << sizeof(Derived) << std::endl; //8+4+8
    return 0;
}

结果(64位系统)

Size of Base: 8
Size of Derived: 24

2. 虚拟继承的类对象的空间大小

在C++中,虚拟继承用于解决多重继承中的菱形继承问题。虚拟继承会影响类对象的内存布局,因为编译器需要在运行时解决虚基类的共享问题,这通常通过引入指针或指针表来实现。

#include <iostream>
class A{
};
class Base {
public:
    int baseData;
};

class Derived1 : virtual public Base {
public:
    int derived1Data;
};

class Derived2 : virtual public Base {
public:
    int derived2Data;
};

class Final : public Derived1, public Derived2 {
public:
    int finalData;
};

int main() {
	std::cout << "Size of A: " << sizeof(A) << std::endl; // 1
    std::cout << "Size of Base: " << sizeof(Base) << std::endl; // 4
    std::cout << "Size of Derived1: " << sizeof(Derived1) << std::endl; // 4 + 8 + 4 = 16
    std::cout << "Size of Derived2: " << sizeof(Derived2) << std::endl; // 4 + 8 + 4 = 16
    std::cout << "Size of Final: " << sizeof(Final) << std::endl; // 8 + 8 + 4 + 4 + 4 + 4 = 32
    return 0;
}

结果

Size of Base: 4
Size of Derived1: 16
Size of Derived2: 16
Size of Final: 32

对Final类详细解释:
虚基类Base的成员只存在一份,但需要存储指针或指针表以便在运行时正确访问。

8 bytes (虚基类指针 1) +
8 bytes (虚基类指针 2) +
4 bytes (Derived1::derived1Data) +
4 bytes (Derived2::derived2Data) +
4 bytes (Final::finalData) +
4 bytes (Base::baseData)
= 32 bytes

3. 普通变量所占空间大小

在C++中,使用sizeof运算符可以计算普通变量所占用的内存空间大小。不同类型的变量占用的内存空间大小可能因系统架构(如32位和64位)和编译器的不同而有所差异。

以下是一些常见的数据类型及其在不同系统上的典型大小:
在这里插入图片描述
解释对long的sizeof:
在64位系统上,long 类型的大小实际上取决于编译器和操作系统的实现。有些系统(特别是遵循 LP64 数据模型的类 Unix 系统)将 long 定义为 8 个字节,而其他系统(如 Windows)可能会将 long 定义为 4 个字节。

#include <iostream>

int main() {
    std::cout << "Size of char: " << sizeof(char) << " bytes" << std::endl;
    std::cout << "Size of bool: " << sizeof(bool) << " bytes" << std::endl;
    std::cout << "Size of short: " << sizeof(short) << " bytes" << std::endl;
    std::cout << "Size of int: " << sizeof(int) << " bytes" << std::endl;
    std::cout << "Size of float: " << sizeof(float) << " bytes" << std::endl;
    std::cout << "Size of double: " << sizeof(double) << " bytes" << std::endl;
    std::cout << "Size of long: " << sizeof(long) << " bytes" << std::endl;
    std::cout << "Size of long long: " << sizeof(long long) << " bytes" << std::endl;
    std::cout << "Size of void*: " << sizeof(void*) << " bytes" << std::endl;

    return 0;
}

结果

Size of char: 1 bytes
Size of bool: 1 bytes
Size of short: 2 bytes
Size of int: 4 bytes
Size of float: 4 bytes
Size of double: 8 bytes
Size of long: 8 bytes  // 在64位系统上
Size of long long: 8 bytes
Size of void*: 8 bytes  // 在64位系统上

4. 复合数据类型(结构体和类)

#include <iostream>

struct MyStruct {
    int a; // 4
    double b; // 8
    char c; // 1 -> 4
};

class MyClass {
public:
    int x; // 4
    float y; // 4
    char z; // 1 -> 4
};

int main() {
    std::cout << "Size of MyStruct: " << sizeof(MyStruct) << " bytes" << std::endl; // 对齐后16
    std::cout << "Size of MyClass: " << sizeof(MyClass) << " bytes" << std::endl; // 对齐后 12
    return 0;
}

5. 数组

#include <iostream>

int main() {
    int arr[10];
    std::cout << "Size of int array[10]: " << sizeof(arr) << " bytes" << std::endl; // 4 * 10 = 40
    return 0;
}

6. 类型别名

#include <iostream>

typedef int MyInt;
typedef double MyDouble;

int main() {
    std::cout << "Size of MyInt: " << sizeof(MyInt) << " bytes" << std::endl; // 4
    std::cout << "Size of MyDouble: " << sizeof(MyDouble) << " bytes" << std::endl; // 8
    return 0;
}

7. 动态分配内存

#include <iostream>

int main() {
    int* ptr = new int[10];
    std::cout << "Size of pointer to int[10]: " << sizeof(ptr) << " bytes" << std::endl; // 8
    std::cout << "Size of dynamically allocated int[10]: " << sizeof(*ptr) * 10 << " bytes" << std::endl; // 4 * 10 = 40
    delete[] ptr;
    return 0;
}

8. 指针

在一个64位系统上,所有指针的大小通常是8字节

#include <iostream>

int main() {
    int* intPtr;
    double* doublePtr;
    char* charPtr;
    std::cout << "Size of char pointer: " << sizeof(charPtr) << " bytes" << std::endl; // 8
    std::cout << "Size of int pointer: " << sizeof(intPtr) << " bytes" << std::endl; // 8
    std::cout << "Size of double pointer: " << sizeof(doublePtr) << " bytes" << std::endl; // 8
    return 0;
}

9. 静态变量

静态变量的大小可以用sizeof运算符计算,但它们不计入包含它们的类的实例的大小。

#include <iostream>

class MyClassWithStatic {
public:
    static int staticVar;
    int regularVar;
};

int MyClassWithStatic::staticVar = 0;

int main() {
    std::cout << "Size of MyClassWithStatic: " << sizeof(MyClassWithStatic) << " bytes" << std::endl; // 4
    std::cout << "Size of MyClassWithStatic::staticVar: " << sizeof(MyClassWithStatic::staticVar) << " bytes" << std::endl; // 4
    return 0;
}

10. 联合体

MyComplexUnion 的最大成员是 double,大小为 8 字节

#include <iostream>

struct MyStruct {
    int x;
    char y;
};

union MyComplexUnion {
    int a;
    double b;
    MyStruct c;
};

int main() {
    std::cout << "Size of MyComplexUnion: " << sizeof(MyComplexUnion) << " bytes" << std::endl; // 8
    std::cout << "Size of int: " << sizeof(int) << " bytes" << std::endl;
    std::cout << "Size of double: " << sizeof(double) << " bytes" << std::endl;
    std::cout << "Size of MyStruct: " << sizeof(MyStruct) << " bytes" << std::endl;
    return 0;
}

11. 结构体使用#program pack

在C++中,结构体的大小不仅取决于其成员的大小,还取决于成员的排列方式和编译器对齐策略。通常情况下,编译器会为结构体的成员添加填充字节,以确保成员在内存中的地址满足对齐要求。

我们可以使用预处理指令#pragma pack来改变编译器的对齐策略,从而影响结构体的大小。比如:#program pack(2),就是按2对齐。

#include <iostream>

struct MyStruct {
    char a; // 1
    int b; // 4
    short c; // 2
}; // 4 + 4 = 8

#pragma pack(1)
struct MyPackedStruct {
    char a; // 1
    int b; // 4
    short c; // 2
}; // 7
#pragma pack()

#pragma pack(2)
struct MyPackedStruct2 {
    char a; // 1->2
    int b; // 4
    short c; // 2
}; // 2 + 4 + 2 = 8
#pragma pack()

#pragma pack(4)
struct MyPackedStruct4 {
    char a; // 1 -> 4
    int b; // 4
    short c; // 2 -> 4
}; // 12
#pragma pack()

int main() {
    std::cout << "Size of MyStruct: " << sizeof(MyStruct) << " bytes" << std::endl; // 8
    std::cout << "Size of MyPackedStruct: " << sizeof(MyPackedStruct) << " bytes" << std::endl; // 7
    std::cout << "Size of MyPackedStruct2: " << sizeof(MyPackedStruct2) << " bytes" << std::endl; // 8
    std::cout << "Size of MyPackedStruct4: " << sizeof(MyPackedStruct4) << " bytes" << std::endl; // 12
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1879568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux多进程和多线程(三)进程间通讯-信号处理方式和自定义处理函数

进程间通信之信号 信号信号的种类 信号在操作系统中的定义如下: 信号的处理流程在 Linux 中对信号的处理⽅式 自定义信号处理函数 信号的发送 kill() 函数:raise() 函数: 示例 : 创建⼀个⼦进程&#xff0c;⼦进程通过信号暂停&#xff0c;⽗进程发送 终⽌信号等待信号 pause()…

mysql解压版本安装5.7

1. 官网下载好解压版本 我这边5.7版本 https://dev.mysql.com/downloads/file/?id523570 mysql官网 创建 my.ini文件 内容如下 [client] #客户端设置&#xff0c;即客户端默认的连接参数# socket /data/mysqldata/3306/mysql.sock #用于本地连接的socket套接字 # 默…

Nginx和CDN运用

一.Web缓存代理 1.工作机制 代替客户机向网站请求数据&#xff0c;从而可以隐藏用户的真实IP地址。将获得的网页数据&#xff08;静态Web元素&#xff09;保存到缓存中并发送给客户机&#xff0c;以便下次请求相同的数据时快速响应。 2.代理服务器的概念 代理服务器是一个位…

YOLOv8目标检测在RK3588部署全过程

一&#xff0c;前言 这是一个关于从电脑安装深度学习环境到实现YOLOv8目标检测在RK3588上部署的全过程。 本人配置&#xff1a; 1&#xff0c;一台笔记本 2&#xff0c;一个香橙派5s 二&#xff0c;深度学习环境配置 2.1 安装anaconda 使用清华镜像源下载https://mirror…

内容营销专家刘鑫炜:说真的,我写文章可不是为了流量!

今天&#xff0c;打开某号后台&#xff0c;发现我的号一夜之间加了几十个粉丝&#xff0c;确实有些意外。 说真的&#xff0c;我写文章的目的真不是为了流量。 在这个被大数据和算法统治的时代&#xff0c;我们常常听到这样的声音&#xff1a;“流量就是一切”。然而&#xff…

对原生input加上:当前输入字数/最大输入字数

源码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 样式…

【解释】i.MX6ULL_IO_电气属性说明

【解释】i.MX6ULL_IO_电气属性说明 文章目录 1 Hyst1.1 迟滞&#xff08;Hysteresis&#xff09;是什么&#xff1f;1.2 GPIO的Hyst. Enable Field 参数1.3 应用场景 2 Pull / Keep Select Field2.1 PUE_0_Keeper — Keeper2.2 PUE_1_Pull — Pull2.3 选择Keeper还是Pull 3 Dr…

深圳制作网站价格怎么样

深圳是中国的经济特区&#xff0c;也是中国最具活力和创新情商的城市之一。随着互联网的普及&#xff0c;越来越多的企业和个人开始意识到拥有一个优质的网站对于提升品牌形象、销售产品和服务、吸引客户等方面的重要性。因此&#xff0c;制作网站成为了一项必不可少的工作。 深…

Linux常见操作问题

1、登录刚创建的用户&#xff0c;无法操作。 注&#xff1a;etc/passwd文件是Linux操作系统中存储用户账户信息的文本文件&#xff0c;包含了系统中所有用户的基本信息&#xff0c;比如用户名、用户ID、用户组ID、用户家目录路径。 注&#xff1a;etc: 这个目录存放所有的系统…

网络----头部

TCP IP UDP udp头部 帧 http 连接 MSS和MTU 图片来源

99 - Apifox使用

子曰&#xff1a;“学而时习之&#xff0c;不亦说乎&#xff1f;有朋自远方来&#xff0c;不亦乐乎&#xff1f;人不知而不愠&#xff0c;不亦君子乎?” 1. 基本介绍 集API 文档、API 调试、API Mock、API 自动化测试于一体。 Apifox Postman Swagger Mock JMeter。 官…

同元软控受邀出席2024年工业软件与新质生产力创新发展论坛

近日&#xff0c;由广东省工业软件学会主办的“2024年工业软件与新质生产力创新发展论坛”在广州成功举办。同元软控深圳子公司副总经理周胜受邀出席&#xff0c;并作《数智驱动创新&#xff0c;科学计算与系统建模仿真加速新质生产力进化》主题演讲。 本次论坛集结工业软件界…

【C++】using namespace std 到底什么意思

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文作为 JohnKi 的学习笔记&#xff0c;引用了部分大佬的案例 &#x1f4e2;未来很长&a…

【python】python企业财务能力数据分析可视化(源码+报告+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【windows】电脑如何关闭Bitlocker硬盘锁

如果你的硬盘显示这样的一把锁&#xff0c;说明开启了Bitlocker硬盘加密。 Bitlocker硬盘锁&#xff0c;可以保护硬盘被盗&#xff0c;加密防止打开查看数据。 方法一&#xff1a;进入“控制面板->BitLocker 驱动器加密”进行设置。或者“控制面板\系统和安全->BitLocke…

x-api-eid-token参数分析与加密算法还原

文章目录 1. 写在前面2. 接口分析3. 算法实现 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

面试框架一些小结

springcloud的⼯作原理 springcloud由以下⼏个核⼼组件构成&#xff1a; Eureka&#xff1a;各个服务启动时&#xff0c;Eureka Client都会将服务注册到Eureka Server&#xff0c;并且Eureka Client还可以反过来从Eureka Server拉取注册表&#xff0c; 从⽽知道其他服务在哪⾥ …

【嵌入式DIY实例】-LCD ST7735显示网络时间

LCD ST7735显示网络时间 文章目录 LCD ST7735显示网络时间1、硬件准备2、代码实现本文将介绍如何使用 ESP8266 NodeMCU Wi-Fi 板实现互联网时钟,其中时间和日期显示在 ST7735 TFT 显示屏上。 ST7735 TFT是一款分辨率为128160像素的彩色显示屏,采用SPI协议与主控设备通信。 1…

管理上的一些思考

1 前言 管理可分为自我管理、平级管理、向下管理和向上管理。 顾名思义&#xff0c;自我管理就是对自己工作、生活等各方面的规划和执行&#xff0c;不涉及与其他人互动、配合等。我们设定人生目标、年度计划、月计划等&#xff0c;都可以认为是自我管理。《增广贤文》有段很…

数据结构与算法笔记:实战篇 - 剖析Redis常用数据类型对应的数据结构

概述 从本章开始&#xff0c;就进入实战篇的部分。这部分主要通过一些开源醒目、经典系统&#xff0c;真枪实弹地教你&#xff0c;如何将数据结构和算法应用到项目中。所以这部分的内容&#xff0c;更多的是知识点的回顾&#xff0c;相对于基础篇和高级篇&#xff0c;其实这部…