考虑这段代码(为简洁起见,删除了错误检查):
int main()
{
int fd, nread;
struct stat st_buff;
/* Get information about the file */
stat("data",&st_buff);
/* Open file data for reading */
char strbuff[st_buff.st_blksize];
fd = open("data",O_RDONLY);
/* read and write data */
do {
nread = read(fd,strbuff,st_buff.st_blksize);
if (!nread)
break;
write(STDOUT_FILENO, strbuff, nread);
} while (nread == st_buff.st_blksize);
/* close the file */
close(fd);
return 0;
}
这段代码在堆栈上为缓冲区分配内存(如果我没有误解的话。)还有alloca()
函数我可以用于同样的目的(我猜)。我想知道为什么我要选择一个而不是其他的?
答案 0 :(得分:2)
你通常想要使用上面的VLA,因为它是干净和标准的,而alloca
是丑陋的而不是标准(好吧,不是在C标准中,无论如何 - 它可能在POSIX)。
答案 1 :(得分:0)
我很确定两者在机器代码级别都是一样的。两者都从堆栈中获取内存。这具有以下含义:
esp
移动了适当的值。probe
'd。ebp
来访问其他本地人)。两种方法都这样做。两者都没有“常规”错误处理(在Windows中引发SEH异常,在Linux上引发任何异常)。
如果你考虑可移植性,有理由选择一个而不是另一个。 VLA不是标准的恕我直言。 alloca
似乎更标准。
P.S。考虑使用malloca
?