我有一个将位图字符串写入浏览器的函数,然后将其打印在屏幕上。目前,这可以通过为每个像素单独生成正确的值并对每个像素使用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));
但我是否会遇到巨大的阵列(数百/数百万个元素)的问题?只是分配到堆解决这个问题?我只是想确保我没有做任何愚蠢的事。
答案 0 :(得分:2)
是的,多次写入会伤害你。
我建议不要单独写每个字节或分配整个字节,而是建议写入一个小缓冲区(可能是几KB)并在每次填充时写入。这应该可以为您节省大量内存成本。
答案 1 :(得分:1)
是的,在使用动态分配的典型情况下,将解决(或至少减轻)问题。在典型的系统(例如,Windows或Linux)上,堆栈限制在几兆字节左右(有些变化,可以调整为链接时间,至少在Windows上)。
您在免费商店中可用的空间往往主要受可用地址空间的限制(或者,在单个大型分配的情况下,连续的地址空间)。分配高达几千兆字节是相当常规的。在64位系统上,更大的分配变得相当合理(在这种情况下,通常主要受可用RAM的限制,以及您愿意使用虚拟内存减少多少)。