PUB:20150121 If a 32-bit integer overflows

@KayGuoWhu
This commit is contained in:
wxy 2015-02-20 00:00:52 +08:00
parent 651ba8285e
commit a12cc5dd8a

View File

@ -1,16 +1,17 @@
如果使用32位整型会溢出那么是否可以使用一个40位结构体代替64位长整型
---------
======
###问题:
#问题
假如说使用32位的整型会溢出在不考虑使用长整型的情况下如果我们只需要表示2的40次方范围内的数是否可以利用某些40位长的数据类型来表示呢这样的话每个整型数就可以节省24位的空间。
如果可以,该怎么做?
需求是:我现在必须处理数以亿计的数字,所以在存储空间上受到了很大的限制。
#回答
###回答
##可以是可以,但是……
可以是可以,但是……
这种方法的确可行,但这么做通常没什么意义(因为几乎没有程序需要处理多达十亿的数字):
@ -22,14 +23,15 @@ struct bad_idea
};
```
在这里变量var占据40位大小但是以生成代码时拥有非常低的运行效率来换取的事实证明“非常”二字言过其实了——测试中程序开销仅仅增加了1%到2%正如下面的测试时间所示而且这么做通常没什么用。除非你还需要保存一个24位的值或者是8位、16位的值这样你皆可以它们放到同一个结构中。不然的话因为对齐内存地址产生的开销会抵消这么做带来的好处。
在这里变量var占据40位大小但是这是以生成代码时拥有非常低的运行效率来换取的事实证明“非常”二字言过其实了——测试中程序开销仅仅增加了1%到2%正如下面的测试时间所示而且这么做通常没什么用。除非你还需要保存一个24位的值或者是8位、16位的值这样你皆可以它们放到同一个结构中。不然的话因为对齐内存地址产生的开销会抵消这么做带来的好处。
在任何情况下,除非你是真的需要保存数以亿计的数字,否则这样做给内存消耗带来的好处是可以忽略不计的(但是为了处理这些位字段的额外代码量是不可忽略的!)。
###说明:
在此期间这个问题已经被更新了是为了说明实际上确实有需要处理数以亿计数字的情况。假设采取某些措施来防止因为结构体对齐和填充抵消好处比如在后24位中存储其它的内容或者使用多个8位来存储40位那么这么做就变得有意义了。
如果有十亿个数每个数都节省三个字节的空间那么这么做就非常有用了。因为使用更小的空间存储要求更少的内存页也就会产生更少的cache和TLB不命中和内存缺页单个缺页会产生数以千万计的指令译者注直译是这样但语义说不通
如果有十亿个数每个数都节省三个字节的空间那么这么做就非常有用了。因为使用更小的空间存储要求更少的内存页也就会产生更少的cache和TLB不命中和内存缺页单个缺页会产生数以千万计的指令 [译者注:直译是这样,但语义说不通!])。
尽管上面提到的情况不足以充分利用到剩余的24位它仅仅使用了40位部分如果确实在剩余位中放入了有用的数据那么使用类似下面的方法会使得这种思路就管理内存而言显得非常有用。
@ -43,9 +45,10 @@ struct using_gaps
```
结构体大小和对齐长度等于64位整型的大小所以只要使用得当就不会浪费空间比如对一个保存10亿个数的数组使用这个结构不考虑使用指定编译器的扩展。如果你不会用到一个8位的值那么你可以使用一个48位和16位的值giving a bigger overflow margin
或者以牺牲可用性为代价把8个64位的值放入这样的结构体中或者使用40和64的组合使得其和满足320。当然在这种情况下通过代码去访问数组结构体中的元素会变得非常麻烦尽管一种方法是实现一个operator[]在功能上还原线性数组,隐藏结构体的复杂性)。
更新:
###更新:
我写了一个快速测试工具只是为了获得位字段的开销以及伴随位字段引用的重载操作。由于长度限制将代码发布在gcc.godbolt.org上在本人64位Win7上的测试结果如下
@ -85,7 +88,7 @@ via:[stackoverflow](http://stackoverflow.com/questions/27705409/if-a-32-bit-inte
作者:[Damon][a][Michael Kohne][b]
译者:[KayGuoWhu](https://github.com/KayGuoWhu)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出