1. 为什么32位系统能表示的最大内存是4G,而不是0.5G?2^32 bit = 2^29 Byte = 2^19K = 2^9M = 2^-1 G = 0.5G
【原因】32位系统能表示的最大内存是4G,linux中编址针对的是byte,而不是bit。即,linux将内存每8bit(一个byte)编一地址,而不是对每个bit编址。
这也就是为什么代码中会有“地址对齐”的规范,可以理解为,linux取数据最小单位是byte,不够一byte的剩余部分就浪费了。该规范是为了更高效处理数据。
2. 为什么下面这个宏不安全?
#define ADT_DLIST_EACH_NEXT(head, link) \
for (link = head; (link = ADT_DLIST_NEXT(link)) != (head); )
【原因】循环中,如果有删除link的操作,会导致链表断开。
删除link后,再执行“ ADT_DLIST_NEXT(link)) ”因link已被删除而失败。
【解决方案】
#define ADT_DLIST_EACH_NEXT_SAFE(head, link, save) \
for ((void) (link = ADT_DLIST_NEXT(head)), save = ADT_DLIST_NEXT(link) ; \
link != (head); \
(void) (link = save), (void) (save = ADT_DLIST_NEXT(link)))
usage:
AdtDList_t* iter;
AdtDList_t* save;
ADT_DLIST_EACH_NEXT_SAFE(&obj->iter_list, iter, save) {
ADT_DLIST_UNLINK(iter);
}