我在C / C ++代码中看到了这一点:
char * GetName()
{
return "Aurian";
}
引擎盖下到底发生了什么?在内存中"Aurian"
存储的位置使得它在我离开GetName()范围时能够存活,并且我得到一个char *吗?我猜它没有遵循相同的规则,返回一个int。这与
char * name = "Aurian";
此实施是否依赖?另外,GetName()只会被编译为"Aurian"
吗?
This thread似乎暗示某些跳转表可能会用于所有字符串文字,无论如何都要用于GCC。
答案 0 :(得分:1)
看起来字符串常量存储在数据段的只读部分(以及其他非零初始化静态变量)。检查组件!
我编译了这个
#include<stdio.h>
char * GetName()
{
return "Aurian";
}
int main()
{
printf("%s", GetName());
return 0;
}
,程序集看起来像
.section .rodata
.LC0:
.string "Aurian"
.text
.globl GetName
.type GetName, @function
GetName:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size GetName, .-GetName
.section .rodata
.LC1:
.string "%s"
.text
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $0, %eax
call GetName
movq %rax, %rsi
movl $.LC1, %edi
movl $0, %eax
call printf
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
答案 1 :(得分:-1)
它用作函数的退出代码,因此它的存储位置取决于操作系统。 C语言没有指定这些低级别的细节。它们因平台而异。
在UNIX风格的系统中,此值将是 wait()或 waitpid()系统调用的返回值。 在调用这些函数之前,返回代码存储在linux内核的PID条目中。
我们知道
全局变量,静态变量,动态变量都有Heap 存储
函数的指针和参数具有堆栈存储
常量变量存储在代码本身(数据段)
所以基于这些类型,这些变量存储在堆栈中,直到它们从堆栈帧返回
在你的情况下,函数在堆栈调用堆栈帧之后在堆栈上找到空间以隐式返回
当它们被返回时,它们被存储在CPU寄存器中..我们可能会使用两个或更多依赖于操作系统的CPU寄存器