在ARM体系结构中,C函数如何返回大小超过一个单词的值
How C function returns value which size more than a word in ARM architecture
在C程序中,内存布局由.BSS、.DATA、.TEXT、HEAP和STACK组成。当函数返回大小小于一个字的值时,它会进入R0寄存器,但如果返回值大于一个字,它会通过内存返回。例如:
LargeType t;
t = func(arg);
实现为:
LargeType t;
(void) func(&t,arg);
我的问题是编译器使用内存的哪一部分来过"t"?
ARM C++ABI基本上使用安腾C++ABI,但有例外。在该ABI中,按值返回大对象的调用约定是,调用者传递一个隐藏指针,函数使用该指针在return语句中创建对象。退货价值优化就是这样实现的。
现在,你提供的翻译是不正确的。您开始使用的代码使用赋值而不是初始化:
LargeType t;
t = func(arg);
编译器完成的翻译相当于:
LargeType t;
LargeType __tmp;
func(&__tmp,arg);
t.operator=(__tmp);
__tmp.~LargeType();
临时变量将在堆栈中创建,地址传递给将使用它创建对象的函数。然后赋值将发生,并且在完整表达式t = func(arg);
的末尾,临时表达式将被销毁。
将其与初始化情况进行比较:
LargeType t = func(arg);
在这种情况下,编译器可以进行您提到的转换,翻译后的代码将是:
LargeType t;
func(&t,arg);
非常重要的区别在于初始化和赋值是完全不同的操作。在初始化的情况下,对象变成,什么都没有,现在有了。在赋值的情况下,对象已经为,它有一个状态,并且可能正在管理资源。如果您建议的转换被允许,则此代码将泄漏内存:
struct Test {
int *p; // assume other members make this object large
Test() : p(new int()) {}
Test(int i) : p(new int) { *p = i; }
Test(Test const & other) : p(new int) { *p = other->p; }
~Test() { delete p; }
Test& operator=(Test const & other) { *p = other->p; }
};
Test f(int arg) {
return Test(1)
}
Test t;
t = f(5);
转换后的代码将在哪里泄漏:
Test t; // allocates a pointer
f(&t, 5); // expands to:
// __ret->p = new int; // leak!
// *(__ret->p) = 5;
调用func(&t,arg)将继续,并用所需值填充t的内存地址。因此,t必须在调用函数的堆栈上分配(除非您想对t进行动态分配,如t=malloc(sizeof(LargeType)),否则它将在堆上)。不确定编译器在这里要做什么。
/* Caller function */
...
LargeType t; /* Allocated on caller's stack */
LargeType *t = malloc(sizeof(LargeType)); /* Allocation on heap */
(void) func(&t, arg); /* Fills up t with required value */
相关文章:
- 使用std::mt19937从字符串中返回一个随机单词
- C++-字符串是否包含一个带有简单循环的单词
- 为什么这个程序返回最后一个单词而不是最长的单词?
- 3-3. 编写一个程序来计算每个不同单词在其输入中出现的次数
- 计算单词中的音节数,但考虑到单词中彼此相邻的任何元音都算作一个音节
- 如何检查流中文件的下一个单词是否为 alpha?
- 给定一个单词数组和一个字符串,如何计算给定字符串中的所有单词
- 计算一个单词在映射中出现的次数 - 使用 transform() - 调用不匹配
- 如何制作一个程序,它使用特定单词加密和解密消息?
- 创建一个函数,返回给定单词在C++中的频率
- 如何将一个单词拆分成字母,并将它们放入一个无序的列表/集合中
- 输入一个字符串并将其除以单词
- 我有一个字符串变量单词= "APA"
- 将字符串中的单个单词替换为另一个单词
- 如何创建一个函数,该函数在文本中查找单词的匹配项,包括跳过
- 如何将行的第一个单词作为一个变量,将行的其余部分作为另一个变量进行归档/存储
- 给定一个字符串,只要您看到单词"ant"替换到字符串中,单词就会"termite"
- 当字符串中只有一个"GOOD"字符串可用时,从没有空格的字符串中提取第一个单词的最佳和有效方法?
- 检查一个文本文件中的单词是否在另一个文本文件 (C++) 中
- 如何插入一个单词并将字母放在2D数组中的不同索引中