簡體   English   中英

使用C ++函數參數保證連續內存

[英]Contiguous memory guarantees with C++ function parameters

Appel [App02]非常簡要地提到C(

  

  

is the apparent mismatch between the need for parameters being in memory due the use of address-of as opposed to in registers due to calling conventions, maybe that is a question for another day. 是由於使用地址而導致參數在內存中的需求明顯不匹配時, 的。在寄存器中由於調用約定,這可能是另一天的問題。

互聯網上有人是錯的,有時候有人就是我。

首先,你的代碼並不總是產生1,2,3,4。只需檢查一下: http//ideone.com/ohtt0正確的代碼至少是這樣的

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這里

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 ++標准沒有調用約定的概念。 這是由編譯器處理的。

在這種情況下,如果標准要求在應用address-of運算符時參數是連續的,那么標准對編譯器的要求與您對它的要求之間存在沖突。

由編譯器決定做什么。 但是,我認為大多數編譯器會將您的要求優先於標准。

標准中沒有關於調用約定或如何傳遞參數的內容。

確實,如果你獲取一個必須存儲在內存中的變量(或參數)的地址。 它沒有說該值不能在寄存器中傳遞,然后在其地址被存儲時存儲到存儲器中。

它肯定不會影響其他變量,不會采用誰的地址。

你的基本假設是有缺陷的。 在我的機器上, foo(1,2,3,4)使用你的代碼打印出來:

1 -680135568 32767 4196336

在64位x86上使用g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM