c++ - 编译器可以将多个 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)可以允许它?
解决方案
不,它不能,因为编译器(通常)不知道何时a
并且b
可能会得到free()
'd,并且如果它将它们都作为单个分配的一部分进行分配,那么它也free()
同时需要它们.
推荐阅读
- sql-server - 无法使用 Python 连接 SQL Server
- laravel - S3 存储桶不允许在 laravel 中上传文件
- android - 当应用程序终止或在后台时,无法通过 fcm 通知启动活动
- azure-active-directory - Azure AD 配置文件映像到 Slack
- r - 如何使用 ggplot 在 x 轴上绘制日期,在 y 轴上绘制价格表和属性?
- file - Kibana FIM 模块中不存在 WAZUH 文件完整性监控的自定义规则(但在所有事件中都存在)
- php - Laravel redirects login page after a delete operation
- visual-studio-code - 无法在 VScode 终端中运行“make”
- asp.net - .net 核心应用程序中的多个 React 应用程序
- vue.js - Vue vuelidate 不工作文件类型输入