Administrator
发布于 2023-12-19 / 1 阅读 / 0 评论 / 0 点赞

c++专项训练

 C语言 结构体 对齐规则

在C语言中,结构体的内存对齐规则是为了提高内存访问效率和减少内存浪费12345。以下是一些关键的对齐规则12345

  1. 第一个成员:结构体的第一个数据成员存放的地址为结构体变量偏移量为0的地址处135

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

  3. 总体对齐:结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍(补齐)12345。总体对齐时,字节大小是 min {所有成员中自身对齐值最大的, 指定对齐值} 的整数倍1

  4. 改变对齐系数:程序员可以通过预编译命令 #pragma pack (n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”1

这些规则可以帮助你理解和计算结构体的大小。如果你有任何其他问题或需要进一步的解释,请随时告诉我!

谢谢你的反馈。修正后的代码如下:

struct THUNDER{ 
  int iVersion; 
  char cTag; 
  char cAdv; 
  int iUser; 
  char cEnd; 
} Thunder; 
int sz = sizeof(Thunder);

在这个修正后的代码中,struct THUNDER结构体包含以下成员:

  • int iVersion;

  • char cTag;

  • char cAdv;

  • int iUser;

  • char cEnd;

在32位系统中,int类型占用4个字节,char类型占用1个字节。因此,我们可以按照以下规则来计算struct THUNDER的大小1

  1. 结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍(对齐)。

  2. 结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节的整数倍(对齐)。

  3. 结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍(补齐)。

因此,struct THUNDER的大小计算如下:

  • int iVersion; 占用4个字节。

  • char cTag; 占用1个字节,但由于需要对齐到4字节,所以实际占用4个字节。

  • char cAdv; 占用1个字节。

  • int iUser; 占用4个字节。

  • char cEnd; 占用1个字节,但由于需要对齐到4字节,所以实际占用4个字节。

所以,sz的值将是4 + 4 + 1 + 4 + 4 = 17字节。但是,由于整个结构体的大小需要是最大基本数据类型成员所占字节数(这里是int,占用4字节)的整数倍,所以struct THUNDER的大小会被补齐到20字节。

因此,执行后,变量sz的值将得到20。1

牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)

赋值操作取值为0

根据你提供的循环条件,这个 for 循环的循环体将永远不会执行。让我们来解析一下循环条件:

```cpp

for (int i = 10, j = 1; i = j = 0; i++, j--)

```

首先,在 C++ 中,`=` 是赋值操作符,而不是相等判断操作符。所以 i = j = 0 会将 j 的值设为 0,然后将 i 的值也设为 0。

然后,条件表达式 i = j = 0 的结果是 0,它被解释为 false。因此,循环体将不会执行。

实际上,你的循环条件相当于 for (int i = 10, j = 1; false; i++, j--),这意味着循环体根本不会被执行,循环次数为 0。

牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)

可见性和生存期


我猜D

几种类型转换

  1. 静态类型转换

    1. static_cast 2者至少有一个可以自动转化,负责错

  2. 动态类型转换

    1. 必须存在继承关系

  3. 去常量

    1. 双方必须是指针或引用,且类型相同

  4. 指针和整数互转


评论