结构体:修改默认对齐数、结构体传参

2024-01-01 15:52

本文主要是介绍结构体:修改默认对齐数、结构体传参,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//——————7.修改默认对齐数

#pragma:预处理指令,可以改变我们的默认对齐数。

//#include <stdio.h>

//#pragma pack(8)//设置默认对齐数为8//设置的开始

//struct S1

//{

//    char c1;

//    int i;

//    char c2;

//};

//#pragma pack()//取消设置的默认对齐数,还原为默认//设置的结束

//注意:如果需要在多个结构体中设置不同的默认对齐数

//#pragma pack(1)//设置默认对齐数为1(为1时表示不进行对齐存放,全部紧挨着,最省空间,就不需要再考虑顺序问题了)

//struct S2

//{

//    char c1;

//    int i;

//    char c2;

//};

//#pragma pack()//此代码为取消设置的默认对齐数,还原为默认

//int main()

//{

//    //输出的结果是什么?

//    printf("%d\n", sizeof(struct S1));

//    printf("%d\n", sizeof(struct S2));

//    return 0;

//}

结论:

结构在对齐方式不合适的时候,我们可以自根据自己的需求自己更改默认对齐数。

/ /————8. 结构体传参

//#include<stdio.h>

//struct S

//{

// int data[1000];

// int num;

//};

//struct S s = { {1,2,3}, 100 };

结构体传参

//void print1(const struct S ss)

//{

// int i = 0;

// for(i=0;i<3;i++)

// {

//  printf("%d ",ss.data[i]);

// }

// printf("%d\n", ss.num);

//}

结构体地址传参

//void print2(const struct S* ps)

//{

// int i = 0;

// for (i = 0; i < 3; i++)

// {

//  printf("%d ", ps->data[i]);

// }

// printf("%d\n", ps->num);

//}

//int main()

//{

// print1(s);  //传结构体(传值调用)直接传值,ss中会有一块单独的空间存放s

// print2(&s); //传地址(传址调用)。传的是s的地址,一个地址的大小是4/8字节,即所需使用的空间就更小一些,

// //效果也就相对于函数传参更加有效果

// return 0;

//}

//在printf1中把s传给ss,更改ss并不会影响s,即s不会被改动过。

// 在printf2中把s的地址传给ps,当误操作ps会导致s的改变,因此在printf2的形参中+count,限制ps改变

//上面的 print1 和 print2 函数哪个好些?

//答案是:首选print2函数。

//原因:

//函数传参的时候,参数是需要压栈(就是在栈空间里面开辟一块区域(或增加一块区域),把形参依次放进去),会有时间和空间上的系统开销。

//如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

// 而当我们采用指针的形式,就不会,就一定程度上变了这个问题的出现

//结论:

//结构体传参的时候,首选传结构体的地址。

这篇关于结构体:修改默认对齐数、结构体传参的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/559758

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2