首页 > 系统相关 >C/C++中结构体占用内存大小的计算方法

C/C++中结构体占用内存大小的计算方法

时间:2023-09-18 18:11:22浏览次数:40  
标签:10 struct int double 内存大小 C++ test 对齐 计算方法

两个值:

  • 对齐系数:一般为8个字节。#pragma pack(8)设置对齐系数为8。
  • 有效对齐值:假设结构体中最长的类型的长度为len,则有效对齐值=min(len,对齐系数)

计算规则:

  • 计算存放的位置:第一个成员放在位置0,后面的成员A存放的时候,会先计算size=min(A大小, 有效对齐值),A只放在size的整数倍的位置。
  • 结构体作为成员:size大小为结构体成员的有效对齐值。
  • 结构体的总大小,必须是其有效对齐值的整数倍,不足的要补齐。

内存对齐的目的是为了内存对齐,减少访存操作。

#include <stdio.h>
#pragma pack(8)
int main()
{
	struct Test
	{
		int a;
		//long double大小为16bytes
		long double b;		     
		char c[10];
	};
	printf("%d", sizeof(Test));  // 8+8+8+10=34 34不是8的倍数,所以为40
	return 0;
} 
#include <stdio.h>
#pragma pack(16)
int main()
{
	struct Test
	{
		int a;
		//long double大小为16bytes
		long double b;		     
		char c[10];
	};
	printf("%d", sizeof(Test)); // 16+16+10=42  42不是16的倍数,所以为48
	return 0;
}
#include <stdio.h>
int main()
{

    struct b
	{
        double y;
        char x;	     
		
	};
	struct a
	{
		int c;
        char x;	   
        b b1; 
		
	};
	printf("%d", sizeof(a)); // 4+4+8+1 = 17 --> 24
	return 0;
} 
#include <stdio.h>
int main()
{
	typedef struct a
	{
		int c;
		double d;		     
		char b[10];
	}test;
	test  e;
	printf("%d", sizeof(test)); // 32
	return 0;
} 
#include <stdio.h>
int main()
{
	typedef struct a
	{
		double d;
		int c;		     
		char b[10];
	}test;
	test  e;
	printf("%d", sizeof(test)); // 24
	return 0;
}

标签:10,struct,int,double,内存大小,C++,test,对齐,计算方法
From: https://www.cnblogs.com/codingbigdog/p/17712722.html

相关文章

  • C++ explicit
    C++explicitexplicit关键字有两个用途:指定构造函数或者转换函数(C++11起)为显示,即它不用用于隐式转换和赋值初始化。可以与常量表达式一同使用。当该表达式为true才为显示转换(C++20起)。1.将构造函数标记为显式C++中的explicit关键字通常用来将构造函数标记为显式类型转换,......
  • C++基础入门
    C++基础入门1C++初识1.1第一个C++程序编写一个C++程序总共分为4个步骤创建项目创建文件编写代码运行程序1.1.1创建项目​ VisualStudio是我们用来编写C++程序的主要工具,我们先将它打开1.1.2创建文件右键源文件,选择添加->新建项给C++文件起个名称,然后点击添......
  • java中使用JNA调用C/C++动态链接库中的函数
    目录C++部分创建动态库项目JAVA部分pom依赖工程结构测试类jna提供C与JAVA数据类型映射参考C++部分创建动态库项目注意:动态库中的头文件,必须要将需要导出的函数包裹在extern"C"{}中,否者在使用侧java工程中,就无法加载并使用JAVA部分pom依赖<dependencies><dependenc......
  • C++ Primer 学习笔记——第十章
    第10章前言在前面我们学习容器的时候,是否发现标准库下的对容器的操作并不是太多(或许,初学时已经觉得好多了......
  • 简单分治快排问题解析(c++实现)
    这几天刷了需要使用分治快排思想去解决的几道比较好的题目,所以写下这篇博客用于复习和以后的复盘。什么是分治快排思想首先我们要知道什么是分治快排思想,这个思想其实就是在模拟实现qsort算法的时候使用的一个方法,在模拟实现qsort的时候,我们知道第一步是需要使用一个随意选择(三数取......
  • C++实现论文查重
    软件工程https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014作业要求根据给出的样例进行查重,并把结果记录在PSP表格中作业目的对查重有一定的初步了解GitHub链接https://github.com/xingch123456789/3119000414PSP表格PSP2.1Person......
  • Qt/C++音视频开发54-视频监控控件的极致设计
    一、前言跌跌撞撞摸爬滚打一步步迭代完善到今天,这个视频监控控件的设计,在现阶段水平上个人认为是做的最棒的(稍微自恋一下),理论上来说应该可以用5年不用推翻重写,推翻重写当然也是程序员爱干的事情,这个就要考验个人的功底,设计的好框架搭建的好,可以很多年不用变,只需要在现有框架小修......
  • C++智能指针
    智能指针是C++语言中一种方便、安全的内存管理工具。智能指针可以自动管理对象的生命周期,避免手动分配和释放内存时可能出现的内存泄漏和悬挂指针等问题。在C++11标准中,引入了三种智能指针:unique_ptr、shared_ptr和weak_ptr。类型含义备注std::unique_ptr 独占资源......
  • C++STL进阶:pb_ds库
    Windows,64bitG++(ISOc20)stack=268435456开启O2优化万能头文件CodeForces在\(\ttC^{20(64)}_{++}\)版本下无法使用bits;如果需要使用priority_queue则无法使用using(会和std撞名字)。#include<bits/extc.h>usingnamespace__gnu_pbds;优先队列(不常用)概述......
  • C++的异常类型与多级catch匹配
    try-catch的用法:try{//可能抛出异常的语句}catch(exceptionTypevariable){//处理异常的语句}我们还遗留下一个问题,就是catch关键字后边的exceptionTypevariable,这节就来详细分析一下。exceptionType是异常类型,它指明了当前的catch可以处理什么类型的异常;varia......