节省内存的方法

一、字节对齐:(定义结构体变量的先后顺序不一样,所占用的内存也不一样)

        字节对齐原则: 1) 结构体成员按自身字节大小自对齐:

                                        自对齐指的是结构体成员的在内存中的起始地址必须是它的自身长度的整数倍。如int型变量(4字节),它                                     的起始地址必须能被4整除。例外:double类型的变量(8字节),它的起始地址只需能被4整除即可。

                                   2)数据补齐:

                                        结构体的总大小是结构体成员中最大成员的整数倍(如果这个最大的成员的数据类型是double,只需是4的                                       倍数即可)

       举例:

                    struct align{                           struct align{                                          struct align{

                           char a;                                  char a;                                                     int a;

                           int b;                                      char b;                                                    char b;

                           char c;                                    int c;                                                       char c;

                     }a1;                                        }a2;                                                        }a3;

       sizeof(a1) == 12                               sizeof(a2) == 8                                      sizeof(a3) == 8

       a1中:a从地址0开始存放,占用一个字节,由于要对齐,b从地址4开始存放,占用4个字节,c从地址8开始存放,占用1个字节。总共9个字节,9不是4(sizeof(b) == 4)的倍数,所以根据数据补齐原则,sizeof(a1)== 12

       a2中:a从地址0开始存放,占用1一个字节,b从地址1开始存放,占用1个字节,由于要对齐,c从地址4开始存放,占用4个字节。总共8个字节,8是4(sizeof(c) == 4)的倍数,所以sizeof(a2)== 8

        a3中:a从地址0开始存放,占用4一个字节,b从地址4开始存放,占用1个字节,c从地址5开始存放,占用1个字节。总共6个字节,6不是4(sizeof(a) == 4)的倍数,所以根据数据补齐原则,sizeof(a3)== 8

  

二、联合体/共用体(union):

         可能很多程序员工作了很久也没用过联合体,尤其是应用层开发的程序员,但是做裸板开发的应该经常见到。最常见的一种用法应该是这样的:

struct st_pubflag
{
	union
	{
		uint WORD;
		struct
		{
			uint rsv:4;			
			uint switch12:1;
			uint switch11:1;
			uint switch10:1;
			uint switch9:1;
			uint switch8:1;
			uint switch7:1;
			uint switch6:1;
			uint switch5:1;
			uint switch4:1;			
			uint switch3:1;
			uint switch2:1;
			uint switch1:1;			
            uint switch0:1;
		}BIT;
	}DATA;
};

        这是一种union结合位段的使用方法,每个switch的值只是0或1,所以如果定义为char,太浪费内存了,使用union可以更方便的统一处理这些switch变量,比如直接给WORD赋值为0,则所有的switch就会否被赋值为0.

三、

       今天新get到一种方法:指针 。当我们要定义一个数组的时候,考虑一下这个数组是不是经常用,当用到的时候会不会对程序其他的功能造成影响,比如:升级用的数组,一般升级的时候其他的功能会关闭。我们可以把用于接收code的数组定义为一个指针,这样可以节省很多内存。

                              各位道友如果有什么其他的方法可以留言,一起学习。我以后发现有新的方法也会续更!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些 Python 内存优化的方法: 1. 使用生成器替代列表:当需要创建一个大型列表时,可以使用生成器来逐个生成元素,而不是一次性将所有元素存储在内存中。这可以节省很多内存。 2. 使用迭代器:使用迭代器进行循环操作可以避免将所有元素存储在内存中。这对于处理大型数据集很有用。 3. 删除不必要的对象:当一个对象不再需要时,可以使用 del 关键字将其从内存中删除。这可以减少内存占用。 4. 使用内存映射文件:内存映射文件允许将文件映射到内存中,以便像访问内存一样访问文件。这可以避免将整个文件读入内存中,从而节省内存。 5. 使用 NumPy:NumPy 是一个 Python 库,用于处理大型数组和矩阵。它使用 C 语言实现,因此速度很快,并且可以减少内存占用。 6. 避免循环引用:循环引用指的是两个或多个对象相互引用,导致无法释放内存。可以使用 weakref 库来解决这个问题。 7. 使用垃圾回收:Python 自带了一个垃圾回收机制,用于自动回收不再使用的内存。可以使用 gc 模块来控制垃圾回收。 8. 使用较小的数据类型:使用较小的数据类型可以减少内存占用。例如,使用整数代替浮点数,使用布尔值代替整数等。 9. 将常用数据缓存到内存中:如果经常需要访问某些数据,可以将其缓存到内存中,以避免每次访问时都重新计算。 10. 使用压缩算法:对于大型的文本或二进制数据,可以使用压缩算法来减少内存占用。Python 自带了 zlib 和 gzip 模块,可以用于压缩和解压缩数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值