[英]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.