【问题标题】:alloca over variable length arrays for character buffer为字符缓冲区分配可变长度数组
【发布时间】:2012-05-04 07:38:17
【问题描述】:

考虑这段代码(为简洁起见,删除了错误检查):

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() 函数我可以用于相同目的(我猜)。我想知道我是否有任何理由要选择其中一个?

【问题讨论】:

    标签: c arrays memory-management stack


    【解决方案1】:

    您通常希望使用上述 VLA,因为它干净且标准,而 alloca 丑陋且不在标准中(好吧,无论如何不在 C 标准中 - 它可能在POSIX)。

    【讨论】:

      【解决方案2】:

      我很确定两者在机器代码级别上是相同的。两者都从堆栈中获取内存。这具有以下含义:

      1. esp 移动了适当的值。
      2. 占用的堆栈内存是probe'd。
      3. 该函数必须有一个正确的堆栈帧(即它应该使用ebp 来访问其他本地变量)。

      这两种方法都是这样做的。两者都没有“常规”错误处理(在 Windows 和 Linux 上引发 SEH 异常)。

      如果您介意便携性,则有理由选择其中一个。 VLA 不是标准的恕我直言。 alloca 似乎更标准一些。

      附:考虑使用malloca

      【讨论】:

      • 我不知道 malloca,但我猜它是 windows 的事,对吧?我的图书馆似乎没有找到 malloca。
      猜你喜欢
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      • 2014-12-31
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多