您现在的位置是:主页 > news > 做个什么类型网站/网站播放视频速度优化

做个什么类型网站/网站播放视频速度优化

admin2025/5/4 19:38:35news

简介做个什么类型网站,网站播放视频速度优化,将自己做的网站用电脑发到网上,wordpress 站库分离目录 01 什么是字节对齐? 02 对齐准则又是什么? 03 为什么要字节对齐呢? 04 字节对齐对我们编程有什么启示? 目的 了解字节对齐,可以知道如何计算类/结构体的大小。 01 什么是字节对齐? 计算机中内存大…

做个什么类型网站,网站播放视频速度优化,将自己做的网站用电脑发到网上,wordpress 站库分离目录 01 什么是字节对齐? 02 对齐准则又是什么? 03 为什么要字节对齐呢? 04 字节对齐对我们编程有什么启示? 目的 了解字节对齐,可以知道如何计算类/结构体的大小。 01 什么是字节对齐? 计算机中内存大…

目录

01 什么是字节对齐?
02 对齐准则又是什么?
03 为什么要字节对齐呢?
04 字节对齐对我们编程有什么启示?

目的

  • 了解字节对齐,可以知道如何计算类/结构体的大小。

01 什么是字节对齐?

  • 计算机中内存大小的基本单位是字节(byte),理论上来讲,可以从任意地址访问某种基本数据类型,但是实际上,计算机并非逐字节大小读写内存,而是以2,4,或8的倍数的字节块来读写内存,如此一来就会对基本数据类型的合法地址作出一些限制,即它的地址必须是2,4或8的倍数。那么就要求各种数据类型按照一定的规则在空间上排列,这就是对齐

02 对齐准则又是什么?

  • 自对齐:是指该类型成员的起始位置的内存地址必须是自身长度的整数倍。如:int 类型只能以0、4、8…这类的地址开始。
  • 程序指定的对齐值:用命令#pragma pack时指定的对齐值。
  • 自定义类型的自身对齐:结构体或类的成员中自身对齐值是成员最大值。
  • 自定义类型的有效对齐值自定义类型的自身对齐和指定对齐值中取较小的值。
字节对齐有以下准则:
  • 结构体变量的首地址能够被其对齐字节数大小所整除。
  • 结构体每个成员相对结构体首地址的偏移都是成员大小的整数倍,如不满足,对前一个成员填充字节以满足。
  • 结构体的总大小为结构体对齐字节数大小的整数倍,如不满足,最后填充字节以满足。
struct MyStruct
{char dda; //偏移量为0,满足对齐方式,dda占用1个字节;double dda1;//下一个可用的地址的偏移量为1,不是sizeof(double)=8的倍数,需要补足7个字节才能使偏移量变为8(满足对齐方式),因此VC自动填充7个字节,dda1存放在偏移量为8的地址上,它占用8个字节。int type; //下一个可用的地址的偏移量为16,是sizeof(int)=4的倍数,满足int的对齐方式,所以不需要VC自动填充,type存放在偏移量为16的地址上,它占用4个字节。
}//所有成员变量都分配了空间,空间总的大小为1+7+8+4=20,不是结构的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为sizeof(double)=8的倍数。所以该结构总的大小为:sizeof(MyStruc)为1+7+8+4+4=24。其中总的有7+4=11个字节是VC自动填充的,没有放任何有意义的东西。

在这里插入图片描述

03 为什么要字节对齐呢?

  • 无论数据是否对齐,大多数计算机还是能够正确工作。
那么为什么还要进行字节对齐呢?最重要的考虑是提高内存系统性能。
  • 需要字节对齐的根本原因在于CPU访问数据的效率问题

  • 前面我们也说到,计算机每次读写一个字节块,例如,假设计算机总是从内存中取8个字节,如果一个double数据的地址对齐成8的倍数,那么一个内存操作就可以读或者写,但是如果这个double数据的地址没有对齐,数据就可能被放在两个8字节块中,那么我们可能需要执行两次内存访问,才能读写完成。显然在这样的情况下,是低效的。所以需要字节对齐来提高内存系统性能。

跨平台通信

  • 由于不同平台对齐方式可能不同,如此一来,同样的结构在不同的平台其大小可能不同,在无意识的情况下,互相发送的数据可能出现错乱,甚至引发严重的问题。因此,为了不同处理器之间能够正确的处理消息,我们有两种可选的处理方法。
  1. 1字节对齐
  2. 自己对结构进行字节填充
  • 我们可以使用伪指令#pragma pack(n)n为字节对齐数)来使得结构间一字节对齐。

04 字节对齐对我们编程有什么启示?

  • 虽然我们不需要具体关心字节对齐的细节,但是如果不关注字节对齐的问题,可能会在编程中遇到难以理解或解决的问题。
因此针对字节对齐,总结了以下处理建议:
  • 结构体成员合理安排位置,以节省空间。
  • 跨平台数据结构可考虑1字节对齐,节省空间但影响访问效率。效率之所以降低,是因为:如果存在更大字节数的变量时(比1大),比如int类型,需要进行多次读周期才能将一个int数据拼凑起来。
  • 跨平台数据结构人为进行字节填充,提高访问效率但不节省空间。
  • 本地数据采用默认对齐,以提高访问效率。

在这里插入图片描述

举例

#include <iostream>
#include <stdio.h>
using namespace std;
int main(){struct A{char a;short b;int c;};cout << "size of struct A = " << sizeof(struct A) << endl;;struct B{short b;int c;char a;};cout << "size of struct B = " << sizeof(struct B) << endl;;}

输出:
在这里插入图片描述

struct A

在这里插入图片描述

struct B

在这里插入图片描述