编程通识 十万个为什么

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);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值