簡體   English   中英

將struct傳遞給函數c ++(效率)

[英]passing struct to a function c++ (efficiency)

我正在測試一個簡單代碼的計時,但看不出有什么區別。 在第一個塊中,它的行為就像只傳遞了指針,在情況2和3中,它的作用就像是按值而不是按引用復制整個結構。 編輯:::結構:

struct e{
    vector<int> a;
};

此代碼需要0秒:

void ola(e &a)
{
    a.a[0] = 1;
    a.a[9999] = 1;
}

int main()
{
    e *a;
    a->a.resize(10000000, 0);
    a->a[0] = 2;
    a->a[99999] = 2;
    ola(*a);
    cout << a->a[0] << " . " << a->a[99999] << endl;
    letras.resize('z' - 'a' + 1);
    string entrada;
}

這需要0.15秒:

void ola(e &a)
{
    a.a[0] = 1;
    a.a[9999] = 1;
}

int main()
{
    e a;
    a.a.resize(10000000, 0);
    a.a[0] = 2;
    a.a[99999] = 2;
    ola(a);
    cout << a.a[0] << " . " << a.a[99999] << endl;
    letras.resize('z' - 'a' + 1);
    string entrada;
}

但是應該沒有任何區別。 也許是因為在匯編器中傳遞時必須復制struct的所有值,所以我嘗試了以下方法:

void ola(e *a)
{
    a->a[0] = 1;
    a->a[9999] = 1;
}

int main()
{
    e a;
    e* b;
    a.a.resize(10000000, 0);
    b = &a;
    a.a[0] = 2;
    a.a[99999] = 2;
    ola(b);
    cout << a.a[0] << " . " << a.a[99999] << endl;
    letras.resize('z' - 'a' + 1);
    string entrada;
}

在最后一個中,我只傳遞了一個指向a的指針,它也需要0.15秒。 為什么我看到這種差異?

正確的想法。 分析您的代碼並測試您的假設,但要確保代碼確實符合您的期望並且分析是准確的。

第一點:向量並不總是通過引用傳遞。 編譯器將竭盡所能通過引用,忽略或拉出許多類似的技巧中的任何一種,因為它的工作量較小,但如果不能,則將復制向量。

第二點:時序代碼很棘手。 覆蓋這里太棘手了。 但是幼稚的假設幾乎總是錯誤的。 一次運行是不夠的。 通常需要多次運行,並對這些多次運行進行統計分析。

我將忽略以下事實:由於未初始化的指針將情況1帶入未定義的區域,因此情況1不起作用。 那只是一個側面展示。

情況1:

void ola(e &a)

a被引用傳遞,實際上是和字面上這里。 除地址外,不會復制任何數據。

ola(*a);

a被解除引用以滿足基准的要求,所以我們正在使用的值a 現在, a是指針這一事實不再重要。 ola獲得參考。

情況2:

void ola(e &a)

相同的原型。 也通過引用傳遞。 除地址外,不會復制任何數據。

ola(a);

a通過引用傳遞。

情況3:

void ola(e *a)

再次通過引用傳遞,但是這次引用是指針。 除地址外,不會復制任何數據。

ola(b);

b是一個指向aola需要一個指針。 無需工作。 a通過引用傳遞。

要按值傳遞,OP必須編寫:

void ola(e a)

如果編譯器覺得喜歡, 可以這樣做。 一個足夠聰明的編譯器會注意到ola絕對沒有副作用,它會修改並丟棄一個副本,然后編譯該函數調用。 天真的配置文件可能會顯示出驚人的高效性能,因為什么也沒發生。

在第一個塊中,您使用的指針( a )在使用前未初始化。 我懷疑您忘記了帖子中的部分代碼。

此外,尚不清楚您要確切地做什么以及您打算什么時間?

在執行任何有用的操作之前,第一個程序可能會崩潰。 指向內存中的無效位置。 它應該是:

e *a = new e();
a->a.resize(10000000, 0);

暫無
暫無

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

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