簡體   English   中英

這段代碼在 C++ 中究竟是如何工作的

[英]How does exactly this code work in C++

例如這段代碼:

#include <iostream>
using namespace std;

void foo(int* x){ cout << "X = " << *x << endl;}

int main()
{
    int value = 5;
    int *p = &value;
    foo(p);
    foo(&value);
    return 0;
}

在函數foo的第一次調用中,實際上在函數內創建了指針 p (x) 的副本,並在函數結束后立即刪除,對嗎? foo的第二次調用中,獲取變量 value 的地址,並使用該地址創建一個指針 x 並在函數結束后立即刪除,對嗎? 就堆棧內存消耗而言,這些調用中哪個更便宜? 還是兩者是一回事?

它們幾乎相同。 唯一的區別是您在main的調用堆棧上有一個指針對象p ,但是如果您要擔心這一點,那么您就會遇到問題。 :)

他們倆很相似。 第一個看起來更昂貴,因為您創建了兩次指針,一次作為局部變量(在main內部),一次作為函數參數(傳遞給foo ),但是編譯器的“優化”階段可能會將第一個變成第二個(假設你對p做的唯一一件事就是傳遞它,你以后不要在main重用它)。

在第一次調用中,您傳遞了一個包含value地址value

在第二個中,您直接傳遞value地址

請注意,賦值運算符表示p&value是相同的,因此您應該能夠將任何一個傳遞給函數,正如您所證明的那樣。

指針具有可以像其他任何東西一樣復制的值。 它們具有值語義。

void foo(int* t);

按值獲取指針。 它將創建指針參數的副本並在其主體內使用它。

int value = 23;
int *p = &value; // &value takes the address of value and use it to copy initialize p
foo(p); // copy the value of the pointer inside foo
foo(&value); // do the same but don't create a temporary

暫無
暫無

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

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