Ric*_*ruz 15 c memory arrays string
为什么C程序员经常以2的幂分配字符串(char数组)?
你经常看到......
char str[128]
char str[512]
char str[2048]
Run Code Online (Sandbox Code Playgroud)
不太常见,你看...
char str[100]
char str[500]
char str[2000]
Run Code Online (Sandbox Code Playgroud)
这是为什么?
我理解答案将涉及以二进制方式处理的内存......但为什么我们不经常看到char str[384],这是128 + 256(两个的倍数).
为什么没有使用两个的倍数?为什么C程序员使用两个幂?
除了一些非常罕见的情况外,没有充分的理由.
揭穿最常见的论点:它有助于内存分配器避免碎片.
大多数情况下它不会.如果你分配 - 比方说 - 256字节,内存分配器将为它的内部管理和内务管理添加一些额外的空间.所以你的分配在内部更大.两个256缓冲区的大小与512字节缓冲区相同?不对.
对于性能,它甚至可能会造成伤害,因为CPU缓存的工作方式.
假设你需要N个某种大小的缓冲区,你可以用这种方式声明它们:
char buffer[N][256];
Run Code Online (Sandbox Code Playgroud)
现在,每个buffer[0]对buffer[N-1]具有在它们的地址相同至少显著比特,这些比特被用来分配高速缓存行.缓冲区的第一个字节都占用CPU缓存中的相同位置.
如果你一遍又一遍地计算每个缓冲区的前几个字节,你将不会从第一级缓存中看到太多加速.
另一方面,如果您将这样声明:
char buffer[N][300];
Run Code Online (Sandbox Code Playgroud)
各个缓冲区在地址中没有相同的最低有效位,并且第一级缓存可以完全使用它.
很多人已经遇到过这个问题,例如在这里看到这个问题:矩阵乘法:矩阵大小差异小,时间差异大
对于两个二进制缓冲区大小,有一些合法的用例.例如,如果您编写自己的内存分配器,则希望以大小等于操作系统页面大小的方式管理原始内存.或者您可能有硬件限制迫使您使用两个幂数(GPU纹理等).
小智 7
一个有趣的问题.OS内存管理使用Buddy内存分配技术时,大小为2 ^ k的块更适合.这种技术处理分配的碎片.https://en.wikipedia.org/wiki/Buddy_memory_allocation
此分配系统将块大小与2的大小对齐.但这用于堆分配.
int * array = (int*) malloc(sizeof(int)*512); // OS manages heap memory allocation
Run Code Online (Sandbox Code Playgroud)
在堆栈上分配缓冲区时,不需要进行块对齐.
int buffer[512]; // stack allocation
Run Code Online (Sandbox Code Playgroud)
我认为没有理由做出2的权力大小.
| 归档时间: |
|
| 查看次数: |
1484 次 |
| 最近记录: |