这会导致堆栈出现问题吗?

时间:2012-04-09 02:34:58

标签: c optimization stack-overflow

我有一个将位图字符串写入浏览器的函数,然后将其打印在屏幕上。目前,这可以通过为每个像素单独生成正确的值并对每个像素使用write(int fd, char *Buff, int NumBytes)函数三次来实现,例如:

for (i = 0; i < IMAGE_HEIGHT; ++i)
{
    for (j = 0; j < IMAGE_WIDTH; ++j)
    {
        blue = blue();
        green = green();            
        red = red();

        write(soc, &blue, 1);
        write(soc, &green, 1);
        write(soc, &red, 1);
    }
}

我想要优化代码并且认为调用write()函数这么多次肯定会让我失去一些东西。因此,我们的想法是将所有值存储在一个字符数组中,然后调用write函数一次:

write (soc, image_array, sizeof(image_array));

但我是否会遇到巨大的阵列(数百/数百万个元素)的问题?只是分配到堆解决这个问题?我只是想确保我没有做任何愚蠢的事。

2 个答案:

答案 0 :(得分:2)

是的,多次写入会伤害你。

我建议不要单独写每个字节或分配整个字节,而是建议写入一个小缓冲区(可能是几KB)并在每次填充时写入。这应该可以为您节省大量内存成本。

答案 1 :(得分:1)

是的,在使用动态分配的典型情况下,将解决(或至少减轻)问题。在典型的系统(例如,Windows或Linux)上,堆栈限制在几兆字节左右(有些变化,可以调整为链接时间,至少在Windows上)。

您在免费商店中可用的空间往往主要受可用地址空间的限制(或者,在单个大型分配的情况下,连续的地址空间)。分配高达几千兆字节是相当常规的。在64位系统上,更大的分配变得相当合理(在这种情况下,通常主要受可用RAM的限制,以及您愿意使用虚拟内存减少多少)。