c/c++中struct定义、声明、对齐方式解析

 更新时间:2018年03月05日 08:56:55   投稿:laozhang  
这篇文章通过C/C++的两种声明方式开始,给大家详细分析了/c+中struct定义、声明、对齐方式,对此有兴趣的朋友可以参考学习下。

一、定义/声明方式

第一种:仅有结构体名,不定义/声明变量

struct MyStruct
{
int i;
char a[10];
double b;
};

第二种:有结构体名,并声明变量名

struct MyStruct
{
int i;
char a[10];
double b;
}structName;

struct MyStruct
{
int i;
char a[10];
double b;
};

struct MyStruct structName;

//可同时定义,如struct MyStruct structName={7,“xxxxxxxxxx”,2.1};

//也可结构体之间直接赋值,如struct MyStruct structName = structName1;

//以上为c风格,c++中struct MyStruct structName可省略struct ,也可不省。

第三种:无结构体名,直接声明变量(对于该结构体,只需要声明一个变量)

struct
{
int i;
char a[10];
double b;
}structName;

第四种:带typedef

typedef struct MyStruct
{
int i;
char a[10];
double b;
}structName;

则structName=struct MyStruct,structName是结构体类型的别名,不是变量。

可以有structName aa=struct MyStruct aa;

也可以这样:

typedef struct
{
int i;
char a[10];
double b;
}structName;

可以直接structName aa,效果跟上面一样。

typedef主要是为了省事,对于c语言定义结构体变量时总要带上struct关键字,typedef之后就不用了,而c++本身就
不需要struct关键字,所以貌似也不需要typedef。

二、对齐方式

如:

struct MyStruct
{
double dda1;
char dda;
int type;
};
int i = sizeof(MyStruct);

经vs2008测试i=16,“sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13”是不对的。这是VC对变量存储的一个特殊处理,为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。

对于上例,16=8+1+3+4,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。

所以整个结构的大小为:sizeof(MyStruct)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何有意义的东西。

又如:

structMyStruct
{
char dda;
double dda1;
int type;
};

sizeof(MyStruct)为24=1+7+8+4+4;11个字节是vc自动填充的,最后加的4是为了让结构的字节边界数为结构中占用最大空间的类型所占用的字节数的倍数。

相关文章

  • C语言链表实现学生管理系统

    C语言链表实现学生管理系统

    这篇文章主要为大家详细介绍了C语言链表实现学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • C++中声明、定义、初始化、赋值区别介绍

    C++中声明、定义、初始化、赋值区别介绍

    在 C++ 中,声明、定义、初始化、赋值是变量的四个基本操作,很多朋友不清楚他们之间有什么区别,今天通过本文给大家介绍下C++中声明、定义、初始化、赋值区别,感兴趣的朋友一起看看吧
    2023-05-05
  • C++中const的实现机制深入分析

    C++中const的实现机制深入分析

    C语言以及C++语言中的const究竟表示什么?其具体的实现机制又是如何实现的呢?本文将对这两个问题进行一些分析,需要了解的朋友可以参考下
    2012-12-12
  • 详解C++中inline关键字的作用

    详解C++中inline关键字的作用

    这篇文章主要为大家介绍了C++中的inline关键字,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • C++深入细致探究二叉搜索树

    C++深入细致探究二叉搜索树

    二叉搜索树是以一棵二叉树来组织的。每个节点是一个对象,包含的属性有left,right,p和key,其中,left指向该节点的左孩子,right指向该节点的右孩子,p指向该节点的父节点,key是它的值
    2022-05-05
  • C++ 情怀游戏贪吃蛇的实现流程详解

    C++ 情怀游戏贪吃蛇的实现流程详解

    贪吃蛇是曾经诺基亚手机上很经典很经典的传统老游戏,80.90后的童年时不多的游戏之一,跟电脑上的扫雷一样,下面来从贪吃蛇手机游戏的前世今生讲起
    2021-11-11
  • C语言中设置用户识别码的相关函数的简单讲解

    C语言中设置用户识别码的相关函数的简单讲解

    这篇文章主要介绍了C语言中设置用户识别码的相关函数的简单讲解,包括setuid()函数和setreuid()函数以及setfsuid()函数,需要的朋友可以参考下
    2015-08-08
  • ESP32CAM摄像头图像实时传输的配置详解

    ESP32CAM摄像头图像实时传输的配置详解

    这篇文章主要介绍了ESP32CAM摄像头图像实时传输,本文通过截图示例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • kernel利用pt regs劫持seq operations的迁移过程详解

    kernel利用pt regs劫持seq operations的迁移过程详解

    这篇文章主要为大家介绍了kernel利用pt_regs劫持seq_operations进行迁移的过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C++示例讲解初始化列表方法

    C++示例讲解初始化列表方法

    这篇文章主要介绍了C++成员初始化列表,除了可以使用构造函数对类成员进行初始化之外,C++还提供了另外一种初始化的方法,叫做成员初始化列表。下面来看看文章的详细吧,需要的朋友可以参考一下
    2022-07-07

最新评论