再谈sizeof——struct 结构存储空间的大小:与成员的顺序、#progma pack参数有关系

FPGA新手必看:XC7Z020最小系统搭建全攻略(附原理图解析) 本文为FPGA新手提供了XC7Z020最小系统搭建的完整实战指南。文章详细解析了电源架构、时钟复位、配置调试等关键硬件电路设计,并重点剖析了外围电路与端口引脚的连接要点及常见陷阱,帮助读者从零开始构建稳定可靠的开发平台。 阅读详情

struct 结构存储空间的大小:与成员的顺序、#progma pack参数有关系

针对字节对齐,环境使用的gcc version 3.2.2编译器(32位x86平台)为例。

 

char 长度为1个字节,short 长度为2个字节,int 长度为4个字节。

struct 子项在内存中的按顺序排列:

1)没有#progma pack(n)参数的情况,各个子项的对齐系数为自己长度。

2)有#progma pack(n)参数的情况,各子项的对齐系数为min(自己长度,n);

3)struct 整体的对其系数为子项对齐系数最大值

 

看下面的例子:

struct A{

char a;      //字长1对其系数1

char b;     //字长1对其系数1

char c;     //字长1对其系数1

};//整体对其系数为1

 sizeof(struct A)值是       

看下图

 

绿色为被填充的内存,黄色为空,因此sizeof(struct A)=3;

 

struct B {

    int a;           //对其系数4

    char b;       //对其系数1

    short c;     //对其系数2

};//整体对其系数4

sizeof(strcut B)值是      

如图

short c对其系数2必须和偶地址对齐,int a同理也与能4的倍数地址对其。

粉色内存被结构占用,因此sizeof(strcut B)=8

 

 

struct C {

    char b;   //对其系数1

    int a;      //对其系数4

    short c;  //对其系数2

};//整体对其系数4

sizeof(struct C)的值是     

如图

int a 从4的倍数地址开始,所以开始地址是4,因为结构整体对其系数为4,因此short c后的两个内存被占用,使大小为4的倍数。

sizeof(struct C)=12

 

#progma pack (2)

struct D {

    char b;    //对其系数min(长度=1,n=2)=1

    int a;       //对其系数min(长度=4,n=2)=2

    short c;   //对其系数min(长度=2,n=2)=2

};//整体对其系数2

sizeof(struct D)值是     

如图

 

#progma pack (2)  对int a的放置产生影响,

#progma pack (n)  只能取1、2、4

因此 sizeof(struct D)=8

 

以上转载自http://blog.163.com/feyeye@126/blog/static/4351010920091082551515/

 

字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
 
  1)  结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
 
  2)  结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal padding);
 
  3)  结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
 

 

指针变量p的sizeof

 
指针是记录了另一个对象的地址,既然是来存放地址的,那么它应该等于计算机内部地址总线的宽度。
 
所以在32位计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位),
 
可以预计在将来的64位系统中指针变量的sizeof结果为8。
 
char* pc = "abc";
int* pi;
string* ps;
char** ppc = &pc;
void (*pf)();//函数指针
sizeof( pc ); // 结果为4
sizeof( pi ); // 结果为4
sizeof( ps ); // 结果为4
sizeof( ppc ); // 结果为4
sizeof( pf );// 结果为4
指针变量的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等,
 
所以MFC消息处理函数使用两个参数WPARAM、LPARAM就能传递各种复杂的消息结构(使用指向结构体的指针)。

 

sizeof(struct)大小

以下测试在gcc 版本 4.1.2 20070626 (Red Hat 4.1.2-14)

struct thread_arg
{
 int n_thread;
 char* sz_thread;
};

 struct thread_arg* st_value;

 printf("st_value = %d, thread_arg = %d\n",sizeof(st_value),sizeof(struct thread_arg));
 
 st_value=(struct thread_arg*)malloc(sizeof(struct thread_arg));
 int n_test1 = sizeof(*st_value);
 st_value->n_thread = 5;
 st_value->sz_thread = "hello kitty";
 int n_test2 = sizeof(*st_value);
 
 printf("test1 = %d, test2 = %d\n",n_test1,n_test2);

 

结果
st_value = 4, thread_arg = 8
test1 = 8, test2 = 8

为什么呢?指针肯定是4 不用质疑,而在结构体中int 4 指针也为4 所以为8

这是最初分配空间时错误的大小,st_value此时指针只有4字节,所以空间大小不对 ,可以写成*st_value
 st_value=(struct thread_arg*)malloc(sizeof(st_value));
 

结果
st_value = 4, thread_arg = 8
test1 = 8, test2 = 8

第一种分配的是8个字节的空间,而第二种是我写错后的指针的4个字节

最终的结果是一致的,其实这时候是越界的,其他内存空间可能已被破坏。

springcloud教程 -- 1.快速搭建入门级demo,看这一篇就够了 废话不多讲,跟紧我,开启你的SpringCloud初体验 首先回顾微服务的基本组成: [图片 here] 生产者:提供服务 消费者:消费服务 服务注册/发现中心:服务注册,发现,监控 所以,首先明白springcloud微服务的架构基础:生产者(client),消费者(client),服务注册/发现中心(server) 阅读详情

相关推荐

实战案例:用多智能体系统模拟房地产市场的架构设计

房地产市场是典型的复杂自适应系统:买方纠结“要不要上车”、卖方盘算“挂多少钱能快速成交”、中介忙着“撮合两边赚佣金”、政府琢磨“怎么调政策稳房价”——每一个参与者的微小决策,最终都会汇聚成“房价暴涨”“成交冰点”这样的宏观现象。传统的计量经济学模型(比如线性回归)假设“所有人都是理性人”,但现实中没人能算清所有变量——你可能因为“同事买了学区房”就跟风,也可能因为“怕失业”而放弃买房。这时候,多智能体系统(MAS)

移动开发前沿的博客 1125

SIZEOF

(ZZ from http://www.gridchina.org/~wfsun/blog/archives/000658.html)SIZEOF--------------------------------------------------------------------------------------------------------关键字:sizeof,字节对齐,多继承

星光灿烂 2360

从平衡车到寻迹小车:IMU963RA九轴陀螺仪实战避坑与四元数融合指南

本文详细解析了IMU963RA九轴陀螺仪在机器人姿态控制中的应用,重点探讨了从六轴升级到九轴系统的技术路径及四元数融合算法。通过实战案例,揭示了如何利用地磁计补偿陀螺积分漂移,并提供硬件集成、传感器校准及算法实现的完整解决方案,有效将8小时漂移控制在2度以内。

weixin_27219587的博客 255

STRUCT的内存

在C语言中,结构体的内存是由先到后顺序占用空间的。 先定义的在低地址,后定义的在高地址。地址采用空间对其策略。 其实这是一篇问题贴,一直没有弄懂是什么问题!!! 在结构体内存中 结构体首元素地址和结构体首地址一致。(C++不一致),c++中,一般会空出开始的4字节,为了区别对象地址,和第一个成员的地址。通常是1字节,但是字节对齐的时候,就占用了4字节。 实际上,你看到sizeof(空结构体...

bit_part的博客 505

YOLOv8-pose姿态估计模型从训练到RK3588部署:让边缘端骨骼识别速度突破60FPS

本教程从“模型训练-转换-边缘部署”全链路拆解了YOLOv8-pose姿态估计方案在RK3588上的落地过程,每一步都经过实战验证。无论是智能健身的动作实时纠正,还是工业设备的关键部件姿态检测,这套流程都能让你以最低成本实现高精度、高实时性的姿态估计应用。如果你在实践中遇到模型转换报错、部署性能不达标等问题,可聚焦某一环节深入优化——毕竟,让AI在边缘端“精准捕捉每一个关键点”,才是技术驱动场景创新的核心。

know_F0727的博客 193

CADENCE 25.1打开元件库ERRORCannot perform the operation because of an exception.

摘要:解决CADENCE25.1打开元件库报错"ERRORCannotperformtheoperationbecauseofanexception"的方法:该错误通常由软件中文设置导致。解决方案为:进入Options→Preferences→MorePreferences,取消勾选两个本地语言选项后重启软件即可恢复正常。此方法简单有效,能快速解决因语言设置导致的元件库访问异常问题。(98字)

0 1020

sizeof关键字详解

sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下。但当我总结的时候才发现,这个问题既可以简单,又可以复杂,所以本文有的地方并不适合初学者,甚至都没有必要大作文章。但如果你想“知其然,更知其所以然”的话,那么这篇文章对你或许有所帮助。菜鸟我对C++的掌握尚未深入,其中不乏错误,欢迎各位指正啊 1

马靖的个人技术博客 1262

被滑块虐了3个月!我终于写出了零失败的Python滑块验证码通杀方案(AI识别+真人轨迹)

缺口识别的偏移量一定要算对:滑块的初始位置一般在图片左侧,宽度约50像素,一定要减去这个初始宽度,不然会滑多了;绝对不要用Selenium的drag_and_drop方法:这个方法是匀速滑动,直接被风控秒识别,必须自己分步控制鼠标移动;滑动前后必须加停顿:真人按住滑块会停0.1-0.3秒再开始滑,松开之前也会停0.05-0.1秒,不要按下去立刻就滑,滑完立刻就松;不要每次都滑的完美无缺:可以设置10%的概率故意滑错一次,然后刷新验证码重新滑,更像真人;无头模式通过率极低。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 502

【C】pragma pack指令

这样做,不仅简化了编程,而且即使协议发生变化,我们也只需修改协议结构的定义即可,其它程序无需修改,省时省力。若用#pragma pack(1),则sample按1字节方式对齐sizeof(sample)==9.(无空字节),比较节省空间啦,有些场和还可使结构体更易于控制。一种方法是通过指针偏移的方法来得到各种信息,但这样做不仅编程复杂,而且一旦协议有变化,程序修改起来也比较麻烦。在了解了编译器对结构空间的分配原则之后,我们完全可以利用这一特性定义自己的协议结构,通过访问结构的成员来获取各种信息。

jiushiguang11的博客 6029

【数据集】30 m地表温度LST数据集

【数据集】30 m地表温度LST数据集

WW、forever的博客 1131

手把手教你学Simulink——基于Simulink的前馈解耦SVPWM整流器仿真

本文详细介绍了基于Simulink的前馈解耦SVPWM整流器仿真方法。针对三相PWM整流器存在的dq轴交叉耦合问题,提出前馈解耦控制方案,通过在电流环中引入耦合电压补偿项,显著提升系统性能。文章包含完整的系统架构、核心算法、Simulink建模步骤及参数设置,仿真结果显示:电流跟踪误差<2%、动态响应时间<0.05s、THD<3%、功率因数>0.999。同时提供了可直接复用的MATLAB代码和工程优化建议,为电力电子工程师实现高精度AC/DC转换提供了实用解决方案。

MHD0815的博客 108

字节存储单元及struct内存分配

当今的计算机系统使用的基本上都是由18世纪德国数理哲学大师莱布尼兹发现的二进制系统。二进制数字系统中只有两种二进制数码——0和1。“bit”(比特)被创造出来代表“binary digit”,1bit代表一个二进制数位。 在有限范围内的可计量数值几乎都可以用二进制数码串组合表示,计算机的内存由数以亿万计的比特位存储单元(晶体管)组成。由于一个位只能表示二元数值,所以单独一位的用处不大。通常将许多位组成一组作为一个基本存储单位,这样就可以存储范围较大的值。

曾梦想仗剑走天涯 9982

【深度学习新浪潮】气候预测模型的研发进展一览(2025年版)

模型类型核心优势适用场景不足ARIMA(统计模型)简单高效、可解释性强短期单变量预测非线性、长时依赖建模差随机森林(机器学习)多特征融合、抗噪声中短期多因素预测空间相关性、时序趋势捕捉弱LSTM(深度学习)长时依赖建模、端到端中长期时序预测物理一致性差、数据需求量大物理知情AI物理规律约束、高可靠性极端天气、长期气候变化模型复杂、计算成本高。

专注:太空算力、AI infra、异构调度、大模型成本工程 529

struct结构体占内存大小计算

以下为在32位编译环境下的信息 1字节:char 2字节:short(不管是不是signed或unsigned) 4字节:int、long、float(不管是不是signed或unsigned) 8字节:double 如果等号是'='这种字符常量的话当然是1字节,如果是“=”这种字符串常量当然是2字节  struct结构体占用的大小是和编译器有关的,在VC和GCC中可能

DaiDaiCris的专栏 2157

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C语言中位域(bit struct)和#pragma pack(n)指令对其影响。

刚才看INTERNETWORKING with TCP/IP Volume 3的时候看到下面代码struct rtp...{  unsigned int rtp_cc:4....};有点奇怪,不知道这个unsigned int rtp_cc:4是什么意思,照例google了下得到如下信息:有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个

※旅程※ 7346

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

关于sizeof(struct)

一般情况下,编译器会把struct中的成员作对齐处理,所以sizeof后不是等于所以成员大小之和。 VC编译器一般会按照顺序为struct中的成员分配内存: (1)分配一个大小等于基大小的内存; (2)从第一个到最后一个成员,取得每个成员的大小为N,调整可插入内存起始地址,使得(可插入内存起始地址 -struct起始地址)为N的倍数(向后移调整),从可插入内存起始地址 开始插入成员, 如果分配的剩...

JxufeCarol的博客 2158

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VC字节对齐全攻略

  VC中下面几个结构体大小分别是多少呢struct MyStruct{    double m4;    char m1;    int  m3;};struct MyStruct {    char m1;    double m4;    int m3;};#pragma pack(push)//保存对齐状态#pragma pack(16)  //设置为16字节对齐struct test

sunewer的专栏 1955

如何使用sizeof计算结构体所占内存大小

** 如何使用sizeof计算结构体所占内存大小 ** 文章目录如何使用sizeof计算结构体所占内存大小前言一、各类型变量在不同运行环境中所占内存大小总结二、正文 前言 本博文用于记录学习过程中遇到的难点知识的总结,可能涉及到许多专业内容的非专业表述。请自动忽略,重在理解。 一、各类型变量在不同运行环境中所占内存大小总结 二、正文 注:下面所有例子都是在32位环境中运行 在计算结构体字节长度之前,需要明确一个概念,即补齐。简单来说,补齐就是以结构体中最大的变量类型为标准,将不满足该标准的变量类型补齐为满

bizhe666的博客 3599

struct占内存大小

注意:struct 的{}后面要加上 ”;“ #include struct A {            int a;           double b;            char c; }; struct B {            double b;             char c;             int a; }; struct C

sanyechong12的专栏 2799

C语言中的字节对齐问题

C语言中的字节对齐问题一.什么是字节对齐,为什么要对齐?    现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。    对齐的作用和原因

wangdongx40423p的专栏 1088

1231

#include #include #include #include struct menber {     int a;     char *s; }; void *create(void *arg) {     struct menber *temp;     temp=(struct menber *)arg;     printf("me

YGGkk的博客 418

udp并发服务器程序----初步

#include #include #include #include #include #include #include #include #include const int NET_BUFFER_NUMBER=1024;const int THREAD_BUFFER_NUMBER=10;const int WORK_THREAD_NUMBER=20;//this struct for th

资深码农 638

Linux中多线程编程并传递多个参数

Linux中多线程编程并传递多个参数实例是本文讲解的内容,不多说,先来看内容。今天上午实验了Linux下的多线程编程,并将多个参数传递给线程要执行的函数。在Linux环境下编译通过后,还将它移到了Android的模拟器中。    以下是实验程序的源代码:    pthread.c    #include    #include    #include    #include

bbs598598的专栏 5190

sizeof()计算结构体的大小

简要说明:结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是简单的把所有成员大小相加,而是遵循一定的规则,需要考虑到系统在存储结构体变量时的地址对齐问题。 一、没有成员的结构体占用的空间是多少个字节?      答案是:1个字节。      这就是实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类

海月汐辰 2万+
上一篇: Linux下进程通信之消息队列
下一篇: TCP并发服务器的简易程序
comwise
博客等级 码龄15年 58粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值