之前的笔记搬运
结构体指针:
当结构体作为参数传递给被调用函数的时候, 会把整个结构体拷贝到栈里,
但是如果参数是传结构体指针的话, 则只会传4字节大小的指针, 从效率上来说,
传指针更快更节省空间当结构体当返回值的时候, 如果返回的大小超过8字节, 则寄存器没法存放返回值,
那么会在调用该函数的时候, 会多传一个参数, 是调用者提前申请好的一个栈空间,
用于储存返回结构体中的内容, 这样也就相当于在调用函数前申请一块结构体大小的内存,并且把指针传进去, 最后把返回值拷贝到该区域, 但是如果用结构体指针当返回值的话,就只会返回4字节的指针, 并且是通过寄存器返回, 不会在栈内申请空间,所以返回值是指针的话更快更节省空间通过以上的结论, 不管是传参还是返回值, 结构体类型大于8字节,都是使用结构体指针比较合适
堆结构:
申请堆: malloc(C) new(C++)
释放堆: free(C) delete(C++)
在Debug版本下, 申请的堆的可使用空间是用 ”CD” 符号填充的, 前后会有 “FD”
符号来防止越界, 在释放之后会使用 “EEFE” 符号来表示该区域是没有使用的区域
堆的标志位结构体:
1 | typedef struct _CrtMemBlockHeader |
这是自己malloc的一块内存, A区就是CrtMemBlockHeader结构体,
005dd188 这是下一个结构体内容 pBlockHeaderNext
00000000 因为是最后申请的结构体了, 所以为上个结构体为空 pBlockHeaderPrev
00000000 自己malloc的堆内存是没有名字和行数的, 所以为空 szFileName
00000000 参照上行 nLine
10000000 申请的堆空间大小, 小尾方式存放 所以是10 nDataSize
01000000 块类型, 1为代码申请, 2为编译器申请, 0为释放状态 nBlockUse
82000000 堆的序号, 也是申请次数 lRequest
fdfdfdfd 溢出标志, 该位置被改变, 释放空间时会崩溃 gap[nNoMansLandSize];
B区就是所申请的内存空间
零散笔记:
断言宏: asssert( 逻辑表达式 )
断言宏中的表达式为真的话, 不会有任何操作, 如果为假的话, 程序会立刻崩溃,
并且显示出错位置, 方便调试者定位出错的原因