[英]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
是一個指向a
和ola
需要一個指針。 無需工作。 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.