当前位置: 首页 > wzjs >正文

地方门户网站有前景吗资源平台

地方门户网站有前景吗,资源平台,永年区住房和城乡建设局网站,电子商务网站建设有什么意义前言&#xff1a; 在上一张讲解了结构体的基本知识&#xff0c;在本章深入讲解一下结构体。 如内存对齐&#xff0c;传参&#xff0c;实现尾段。 首先提一个问题吧&#xff0c;如下的代码结果输出是多少&#xff1f; #include <stdio.h> struct s1 {char name;int id…

前言:

在上一张讲解了结构体的基本知识,在本章深入讲解一下结构体。

内存对齐传参实现尾段

首先提一个问题吧,如下的代码结果输出是多少?

#include <stdio.h>
struct s1
{char name;int id;char xue;}s1;
struct s2
{char e1;char e2;int e3;
}s2;
int main()
{printf("%zd\n", sizeof(s1));printf("%zd\n", sizeof(s2));return 0;
}

6,6???

nonono。

大家是如何计算的了,是char是一个字节,int是4个字节,是所以相加一共6个字节嘛?

正确的答案如下:

这就需要本章的知识了。

结构体内存对齐

对齐规则

  • char:1字节对齐
  • short:2字节对齐
  • int:通常为4字节对齐,但在某些平台可能为2字节对齐。
  • double:8字节对齐。
  1. 结构体对齐

    四大黄金法则

    • 首地址规则:结构体首地址 = max(成员对齐要求) 的整数倍

    • 成员偏移规则:成员偏移量 = min(成员大小, 当前对齐值) 的整数倍

    • 整体大小规则:结构体总大小 = max(成员对齐要求) 的整数倍

    • 嵌套结构规则:子结构体的对齐值取其自身最大对齐值

问题分析: 

struct Example 
{
char c1;
int n;
char c2;};               // 总大小=12字节

 c1在0的位置储存。

n不在1的位置储存,因为法则二中说了,偏移量是当前的的整数倍,所以向下浪费3个大小,n储存在4的位置,占4个字节。

c2储存在8的位置,结束了嘛?

没有。根据法则三总大小是max的整数倍,max也就是4,int的字节大小,所以继续向下浪费3各大小。

总大小是12。

大家可以分析一下s2是如何储存的了。

s1与s2的区别是顺序换了一下

struct s2
{char e1;char e2;int e3;
}s2;

分析如下: 

0,1分别储存e1,e2 

2不是4的整数倍,所以向下浪费2个字节,在储存int的四个字节,在分析它的储存值是max的整数倍嘛,欧克是滴

答案是8!!

为什莫存在内存对齐

  1. 平台(移植性)原因:
    不是所有的硬件平台都能够访问任意地址上的任意数据。例如:特定的硬件平台只允许在特定地址获取特定类型的数据,否则会导致异常情况。

  2. 性能原因:
    若访问未对齐的内存,将会导致 CPU 进行两次内存访问,并且要花费额外的时钟周期来处理对齐及运算。而本身就对齐的内存仅需要一次访问就可以完成读取动作。

修改默认对齐数

在C语言中,修改默认对齐数通常通过编译器特定的预处理指令实现。以下是详细步骤和注意事项:

方法:使用 #pragma pack(n)

  1. 设置对齐数

    #pragma pack(n)  // 将默认对齐数设置为n字节(n通常为1, 2, 4, 8等)

    此指令后的结构体将按照n字节对齐,直到遇到新的#pragma pack指令。

  2. 恢复默认对齐

    #pragma pack()  // 恢复编译器默认对齐方式

  3. 保存并恢复原有设置(推荐)

    #pragma pack(push, n)  // 保存当前对齐状态,并设置新对齐数为n
    // 定义需要特殊对齐的结构体
    #pragma pack(pop)      // 恢复之前保存的对齐状态

示例:

#include <stdio.h>#pragma pack(push, 1)  // 保存当前对齐,设置对齐数为1
struct Example {char a;    // 1字节int b;     // 4字节(原本可能需要对齐到4,现按1字节对齐)double c;  // 8字节(原本可能需要对齐到8,现按1字节对齐)
};
#pragma pack(pop)      // 恢复原有对齐int main() {printf("结构体大小: %zu\n", sizeof(struct Example));  // 输出:1 + 4 + 8 = 13(无填充)return 0;
}

注意事项

  1. 编译器差异

    • #pragma pack 是MSVC和GCC等主流编译器支持的指令,但属于编译器扩展,不属于标准C。

    • GCC还支持 __attribute__((packed)) 对单个结构体取消对齐:

      struct Example {char a;int b;double c;
      } __attribute__((packed));

  2. 性能影响

    • 减少对齐数可能降低内存占用,但可能导致未对齐内存访问,影响性能(尤其在硬件要求严格对齐的平台上)。

  3. 可移植性

    • 依赖编译器指令的代码可能在不同平台间表现不一致,建议封装平台相关代码并使用条件编译。

总结:

本章讲解结构体的内存对齐,对齐值,和修改对齐数。

如果有所帮助的请关注一下,我们下章再见!!!

http://www.dtcms.com/wzjs/345971.html

相关文章:

  • 杭州网站做的好公司哪家好郑州网站推广效果
  • 响应式网站建设公司昆明seo关键字推广
  • 聚名网怎么赚钱宁波seo公司排名
  • 网站 河北 备案 慢什么是seo什么是sem
  • 龙岗建设招标局网站网络推广平台大全
  • 做网站cookie传值搜索引擎优化的重要性
  • 自助建设分销商城网站西安百度推广公司
  • 有哪些做网站好的公司好舆情信息网
  • 用地方别名做网站名中国国家培训网正规吗
  • 美国网上做调查赚钱10大网站推荐长沙有实力的关键词优化价格
  • 做礼品建什么网站近几年的网络营销案例
  • 楚雄市网站建设公司搜索引擎排名国内
  • 网站模版免费个人网站设计方案
  • 用网站模板做新网站青岛网站建设培训学校
  • 冬创网站建设培训中心龙岗网站推广
  • 用dreamweaver建设网站成品网络推广有前途吗
  • 山西网站的公司seo技术培训茂名
  • 嘉兴高端网站建设千万别手贱在百度上搜这些词
  • 网站怎么做才有收录常德网站设计
  • 绍兴做网站的公司百度网盘登录入口网页版
  • 沈丘做网站去哪里中国万网域名注册服务内容
  • 京东网站建设的主旨关键信息基础设施安全保护条例
  • 男女直接做那个的视频网站武汉网络推广seo
  • 深圳网站设计公司排名中国企业网络营销现状
  • 建设工程合同网站it培训班
  • 网站logo大全如何推广自己的网站
  • 在线做文档的网站seo简单速排名软件
  • 两学一做教育网站链接推广平台
  • 所有网上购物的网站全网营销代运营
  • 便宜靠谱的建站公司广州顶正餐饮培训学校