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

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

相关文章

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

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

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

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

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.