2016-08-25 62 views
4

我有一些代碼,看起來像這樣:如何根據條件簡潔地分配給結構體的成員?

struct mystruct 
{ 
    /* lots of members */ 
}; 

void mystruct_init(struct mystruct* dst, int const condition) 
{ 
    if (condition) 
    { 
     /* initialize members individually a certain way */ 
    } 
    else 
    { 
     /* initialize members individually another way */ 
    } 
} 

選項我考慮:

  • 最簡單的將有一個分配給每一個成員函數和調用。我是否應該只希望編譯器能夠優化該呼叫?
  • 定義一個宏以顯式避免函數調用開銷。
  • 寫一切都很漫長。

什麼是C11來處理這種情況下的正確方法?

+0

沒有什麼錯,你有什麼。可讀性很重要。你可以將一些線條吊起來,例如'dst-> foo =條件?5:7;'但是考慮哪一個選項使讀者更加明白髮生了什麼以及爲什麼。 –

+1

考慮在'if'的每個分支中使用'compound literals'和'指定初始值設定項':'* dst =(struct mystruct){.member1 = value1,.member2 = value2,...};'。 –

+0

如果'struct'需要是'const',你可以創建一些包含不同初始化列表的宏,然後在它們之間加上'#ifdef'。不漂亮,但沒有其他選擇。 – Lundin

回答

7

只寫初始化一個成員函數,或者如果你想(意見爲主),使用宏。

順便說一句,我會親自做這樣的:

void mystruct_init(struct mystruct* dst, int const condition) 
{ 
    if (condition) 
     init_first_way(..); 
    else 
     init_second_way(..); 
} 

或者只是使用三元運算。請記住,你關心可讀性,總是心裏有:

簡單是一種美德!


我真的覺得在這個階段擔心的優化將使受害者不成熟的優化的,因爲我懷疑這將是瓶頸。一般來說,如果你想優化你的代碼,你的代碼(雖然它運行優化標誌,許多人不知道這一點,我是其中之一:Poor performance of stl list on vs2015 while deleting nodes which contain iterator to self's position in list),找到瓶頸,並嘗試優化瓶頸。

+3

提及'不成熟優化'的+1。如上所述,不成熟的優化是所有邪惡的源泉:) [http://c2.com/cgi/wiki?PrematureOptimization] – Arun

+0

@Arun它不是關於優化,而是關於簡潔性。我對編譯器優化不是很熟悉,所以我不想不必要地做一些效率不高的事情。謝謝你們兩人指出了這一點,它提醒我當我甚至沒有測量過時,不要再擔心這樣的事情。 – user2296177

+0

@ user2296177在那裏,做到了,看看我的編輯。雖然我感覺到風使你問這個問題,但這就是爲什麼我投了贊成票。 – gsamaras

7

我不認爲這裏有任何明確的規則。對我而言,這取決於作者的口味。

兩個顯而易見的方法是:

// initialize members that are independent of 'condition' 

if (condition) { 
    // initialize members one way 
} 
else { 
    // initialize members another way 
} 

同樣可以寫爲:

// initialize members that are independent of 'condition' 

// initialize members based on 'condition' 
dst->memberx = condition ? something : something_else; 
// ... 

請不要擔心一個函數調用的開銷。

+1

最後一句話觸動了我的心,真好! – gsamaras

+0

謝謝@gsamaras – Arun

4

我同意已發佈的回覆(@gsamaras和@Arun)。我只是想展示另一種我發現有用的方法。

的做法是讓一些常量與兩個(或更多)的相關初始化值,然後根據一個(或多個)條件下的簡單任務。

簡單的例子:

#include<stdio.h> 
#include <string.h> 

struct mystruct 
{ 
    int a; 
    float b; 
}; 

const struct mystruct initializer_a = { 1, 3.4 }; 
const struct mystruct initializer_b = { 5, 7.2 }; 

int main (void) 
{ 
    int condition = 0; 
    struct mystruct ms = condition ? initializer_a : initializer_b; 
    printf("%d %f\n", ms.a, ms.b); 
    return 1; 
} 
相關問題