字节对齐
今天在为struct 分配内存的时候,发现有鬼!
1 | void test(){ |
猜猜它会输出什么呢 ? 如果按照预期计算,在64位windows中它所占用的内存是 4+4+1=9 Byte 妥妥的没有问题, 可它实际输出的值12 Byte,平白无故多了3字节? 之前我也是不解,直至看了咕叽咕叽的文章。才知道有字节对齐规则,原因是为了方便CPU取数据!
emm 然后就引发了下面的这个问题…
结构体或对象中如何声明变量可能更省内存
应为存在字节对齐,所以变量的声明顺序不同,所占内存也可能不同!
例如:
1 | void test(){ |
它占用多大内存呢? 答案是 24Byte!
然后换一下变量声明顺序:
1 | void test(){ |
仅仅占用了16Byte! 所以如有必要声明变量时最好还是从大到小是更好的选择! 不过,我其实也读过一两本书呢,对于这些问题书中却从未提及。
住手,这不是Java!
好久没写C了,在用C写数据结构时,遇到了一个很基础的问题!不过我把锅甩给了Java
看代码:
1 | Node_list * createNode(int data){ |
我本是想函数放回Node_lsit的指针,不过我可能忘记了堆栈概念了,它确实会放回Node_list的指针,不过这个指针是空的!以为node是栈变量,方法出栈后,内存自然被free了!所以我得到的是一个空指针!
为了验证我的想法,我又进行了以下尝试:
1 | Node_list * createNode(int data){ |
我确确实实得到了指向Node_list的一个指针!
所以后将程序修改为:
1 | Node_list * listp=(Node_list *)malloc(sizeof(Node_list)); |
直接在堆上分配内存! 这样每次调用函数都会得到新的Node_list指针了!