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

标签 c++ function memory-management calling-convention

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/

相关文章:

c++ - 是否有可能有一个指针指向由奇怪的递归模板创建的基类?

c++ - 在没有#define 的情况下在头文件中声明数组大小

c++ - 将 std::unique_ptr 插入 boost:ptr_map

c++ - 将参数传递给没有特定顺序的 C++ 函数

iOS内存管理?

c++ - 如何正确清除内存?

function - Selenium 中的驱动程序不存在 getWindowHandle 函数

Python 3.x - 返回另一个函数的简单函数

c# - 内存平铺管理和大对象 C#

c++ - boost::函数内存使用情况