结构体详解

结构体:

一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构

结构体可以用来封装一些属性来组成新的类型。

结构体的大小:

结构体的大小不是结构体元素单纯相加。内存对齐(若计算机使用32位字长的cpu,对32位的cpu而言,取四个字节的数要比取一个字节的数更高效。因此在结构体中每个成员的首地址都是4的整数倍,取数据元素时会更高效,也更方便)

每个特定平台上的编译器都有自己默认"对齐系数"(对齐模数)

程序员可以通过预编译命令#pragmapack(n),n=1,2,4,8,16来改变这一系数,n就是对齐系数

C语言结构体对齐步骤:

1.结构体各成员对齐

2.结构体总体对齐

C语言结构体对齐规则:

1.结构体(struct)的数据成员,第一个数据成员存放的地址为结构体偏移量为0的地址处

2.其它结构体成员自身对齐时,存放的地址为min{有效对齐值为自身对齐值,指定对齐值}的最小整数倍的地址处

自身对齐值:结构体变量里每个成员的自身大小

指定对齐值:有宏#pragma pack(N)指定的值N一定是2的幂次方。如1,2,4,8,16等。

如果没有定义宏,32位主机上默认指定对齐值为4,64位默认对齐值为8,ARM CPU默认指定对齐值为8;

有效对齐值:结构体成员自身对齐时有效对齐值为自身对齐值与指定对齐值中较小的一个

3.总体对齐:字节大小是min{所有成员中自身对齐值最大的,指定对齐值}的整数倍

构造函数初始化结构体

1.为什么要使用构造函数初始化结构体

a.如果有某个成员未被初始化,那么在这种情况下,跟随在该成员后面的成员都不能初始化

b.如果结构体包括任何诸如字符串之类的对象,那么在许多编译器上将无法运行

因此可以使用构造函数来初始化结构体成员变量,与初始化类成员变量相同。

以下是一个名为 Employee 的结构体的声明语句,它包含一个具有两参数的构造函数,以便在创建一个 Employee 变量而不向其传递任何参数时,提供默认值:

cpp 复制代码
struct Employee
{
    string name;    // 员工姓名
    int vacationDays,    // 允许的年假
    daysUsed;    //已使用的年假天数
    Employee (string n ="",int d = 0)    // 构造函数
    {
        name = n;
        vacationDays = 10;
        daysUsed = d;
    }
};
相关推荐
旖旎夜光18 分钟前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
揽星河..36 分钟前
【C语言】结构体
c语言·开发语言
2601_966949651 小时前
如何封装 qd.klines.batch(),让批量 K 线查询函数在多个策略中复用?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
小超人诞生日记1 小时前
C++ 智能指针的使用及其原理详解
c++·算法
神仙别闹2 小时前
基于Python实现英词语自动对齐系统
开发语言·python
akinggw2 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
老歌老听老掉牙3 小时前
圆柱端面四平面交线及其在yoz面投影的几何解析与 Python 实现
开发语言·python·平面
繁星蓝雨3 小时前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
女神下凡3 小时前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
旖旎夜光3 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习