日记 2019.12.12
1
用malloc
分配内存
1 |
|
sizeof(double)
=8
2
1 |
|
而我修改后,直接省去了data
这个变量,因为看不到有什么用。(或许是,我修改后的代码,因为使用了智能指针,所以不需要data
做某种辅助?)
PS:在HomeOfVapourSynthEvolution的Curve.cpp,能看到这种“成对”的模式,用malloc
和calloc
来分配内存的变量都用free
做了释放。相比之下,我自己该的代码,在新定义lut
这个变量时,用了malloc
,却没有用free
,而是用delete
去删除的。
delete
不仅释放内存,而且会调用析构函数,而free
不会调用析构函数。
Curve.cpp的代码
1 |
|
我自己的代码
1 |
|
如知乎上所说,可以把delete
看成做了两件事,一是free
,另一是调用析构。
根据这篇博文测试的代码,得出“new 和 delete,malloc 和 free 只能匹配使用,不能混用”。
虽然这么说,但我想了一会,还是说不出,把我现有代码中的delete d->lut;
改成free(d->lut)
的理由…emm先不管了,我记得之前测试过这两种代码,似乎也没么(速度上的)区别…先这样吧…
3
1 |
|
是不是要这么理解:free
和malloc
是成对出现的,因为用了两次malloc
,所以就要有两次free
。
4
以下笔记照抄自菜鸟教程。
“类声明只声明一个类的”尺寸和规格”,并不进行实际的内存分配”
“static 被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间”
“static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问”
5
从malloc
可分配的最大内存,看似去与size_t
相关,到一些关于size_t
的基础知识。
涉及到uintptr_t
类型。
在这篇博客中讲得清楚,uintptr_t
是类型别名。
具体的定义如下
1 |
|
可以看到,unintptr_t
是类型unsigned long int
(64bit)和unsigned int
(32bit)的别名。
PS:再回到修改代码的起点,看一下uint8_t
和uint16_t
等的定义(来自stdint.h)
1 |
|
由上可知,uint8_t
对应char
类型,长度为1字节,uint16_t
对应short int
类型,长度为2字节。
在实际代码中,二者分别对应8bit图像和16bit图像(或者说9~16bit图像)。
现在我需要回答一个问题,这样用不同类型/长度的变量去储存图像,究竟只是为了节省内存,还是必要之举?(我在测试用uint16_t
类型变量储存8bit图像时,输出的图像是错误的,这样来看是必要的,但原理呢?为什么10bit图像就没事?->是否是对于10bit图像,有某种填0的机制?而8bit就会有内存越界的问题?)