gpt4 book ai didi

c++ - 使用 C++ 函数参数的连续内存保证

转载 作者:可可西里 更新时间:2023-11-01 16:40:06 28 4
gpt4 key购买 nike

Appel [App02]非常简短地提到,当寻址运算符应用于功能 block 中的形式参数之一时,C(并且可能是 C++)提供了关于实际参数在连续内存中的位置的保证,而不是寄存器。

例如

void foo(int a, int b, int c, int d)
{
int* p = &a;
for(int k = 0; k < 4; k++)
{
std::cout << *p << " ";
p++;
}
std::cout << std::endl;
}

和诸如...的调用

foo(1,2,3,4);

将产生以下输出“1 2 3 4”

我的问题是“这如何与调用约定交互?”

例如,GCC 上的 __fastcall 将尝试将前两个参数放入寄存器,将其余参数放入堆栈。这两个要求相互矛盾,是否有任何方法可以正式推理将会发生什么,或者它是否受实现定义行为的反复无常的影响?

[App02] Modern Compiler Implementation in Java, Andrew w. Appel, Chapter 6, Page 124

更新:我想这个问题已经得到解答。我认为我错误地将整个问题基于连续的内存分配,当我正在寻找的(以及引用文献所说的) 是由于使用地址而需要内存中的参数之间的明显不匹配 -由于调用约定而不是在寄存器中,也许这是另一天的问题。

网上有人错了,有时有人是我。

最佳答案

首先,您的代码并不总是产生 1、2、3、4。只需检查这个:http://ideone.com/ohtt0正确的代码至少像 this :

void foo(int a, int b, int c, int d)
{
int* p = &a;
for (int i = 0; i < 4; i++)
{
std::cout << *p;
p++;
}
}

现在让我们尝试使用 fastcall, here :

void __attribute__((fastcall)) foo(int a, int b, int c, int d)
{
int* p = &a;
for (int i = 0; i < 4; i++)
{
std::cout << *p << " ";
p++;
}
}

int main()
{
foo(1,2,3,4);
}

结果很乱:1 -1216913420 134514560 134514524

所以我真的很怀疑这里能保证什么。

关于c++ - 使用 C++ 函数参数的连续内存保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5471874/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com