首页 > 解决方案 > 编译器可以将多个 malloc 调用合并为一个吗?

问题描述

假设我们有以下两段代码:

    int *a = (int *)malloc(sizeof(*a));
    int *b = (int *)malloc(sizeof(*b));

    int *a = (int *)malloc(2 * sizeof(*a));
    int *b = a + 1;

它们都在堆上分配了两个整数,并且(假设正常使用)它们应该是等价的。第一个似乎更慢,因为它调用 malloc 两次,并且可以产生对缓存更友好的代码。然而,第二个可能是不安全的,因为我们可以通过增加 a 并写入结果指针意外地覆盖 b 指向的值(或者恶意的人可以通过知道 a 的位置立即更改 b 的值)。

上述说法可能不正确(例如速度在这里受到质疑:最小化 malloc() 调用的数量可以提高性能?)但我的问题是:编译器可以进行这种类型的转换还是有一些根本不同的东西两者之间按标准?如果可能的话,哪些编译器标志(比如说 gcc)可以允许它?

标签: c++cmalloc

解决方案


不,它不能,因为编译器(通常)不知道何时a并且b可能会得到free()'d,并且如果它将它们都作为单个分配的一部分进行分配,那么它也free()同时需要它们.


推荐阅读