内存对齐详细解释

内存对齐详细解释

如果结构体存储下标从0開始的

先是依照#pragma pack(8)參数依次和数据成员比較:依照成员下标是比較结果中小者的倍数;

最后再依照#pragma pack(8)參数与结构体成员占空间最大者比較,结构体总体的长度是比較结果中小者的倍数;

 

1、分析说明:

字节对齐(#pragma pack(2))

输出结果:sizeof(structtest_t) = 10 [两个编译器输出一致]

分析过程:

1) 成员数据对齐

#pragmapack(2)

structtest_t {

inta; /* 长度4> 2 按2 对齐;起始offset=00%2=0;存放位置区间[0,3]*/

charb; /* 长度1< 2 按1 对齐;起始offset=44%1=0;存放位置区间[4]*/

shortc; /* 长度2= 2 按2 对齐;起始offset=66%2=0。存放位置区间[6,7]*/

chard; /* 长度1< 2 按1 对齐;起始offset=88%1=0;存放位置区间[8]*/

};

#pragmapack()

成员总大小=9

2) 总体对齐

总体对齐系数=min((max(int,short,char), 2) = 2

总体大小(size)=$(成员总大小)$(总体对齐系数)圆整= 10 /* 10%2=0 */

 

 

 

2、实际样例:

 

样例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
/*
先是依照#pragmapack(2)參数依次和数据成员比較:依照两者之中小者对齐;
最后再依照#pragmapack(2)參数与结构体成员占空间最大者比較,总体的长度是小者的倍数;
*/
#pragma pack(4)
struct test_1 {
       inta;             /* 长度4 =4  按4 对齐。起始offset=00%4=0;存放位置区间[0,3]*/
       charb;    /* 长度1 < 4 按1 对齐。起始offset=44%1=0;存放位置区间[4] */
       shortc;   /* 长度2 < 4 按2 对齐;起始offset=66%2=0。存放位置区间[6,7]*/
       chard;    /* 长度1 < 4 按1 对齐;起始offset=88%1=0;存放位置区间[8] */
                            /*总体要求:成员中占空间最大的与pack(4)比較,总体长度依照小者对其
                               眼下总体length=9,而要求是4的倍数,因此结果须要是12
                            */
};
#pragma pack()
 
#pragma pack(2)
struct test_2 {
       inta;             /* 长度4 > 2 按2 对齐。起始offset=0 0%2=0。存放位置区间[0,3] */
       charb;    /* 长度1 < 2 按1 对齐;起始offset=44%1=0。存放位置区间[4] */
       shortc;   /* 长度2 = 2 按2 对齐;起始offset=6 6%2=0。存放位置区间[6,7] */
       chard;    /* 长度1 < 2 按1 对齐。起始offset=88%1=0;存放位置区间[8] */
                            /*总体要求:成员中占空间最大的与pack(2)比較,总体长度依照小者对其
                               眼下总体length=9,而要求是2的倍数,因此结果须要是10
                            */
};
#pragma pack()
 
int main(int argc, char *argv[])
{
  printf("%d\n", sizeof(struct test_1));
  printf("%d\n", sizeof(struct test_2));
  return 0;
}


3、sizeof()測试结果:

int (*ptr)[3]; //ptr代表指针,因此測得值为4

int *ptr[3]; //ptr代表数组名,每一个成员是int * 。因此占3个*4=12

ptr代表数组名时,測得是数组所占内存空间的大小

ptr代表指针名时,測得是指针变空间由内存大小占用量

 

版权声明:本文博主原创文章,博客,未经同意不得转载。

内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值