2015-10-20 62 views
2

中分配一個char *指針值(誰是結構成員)的最優化方法我試圖做一個結構的集合,它的一些成員是一個字符串類型,並且由於字符串是'昂貴的'來處理我試圖通過使用指針來最大化性能。在struct []

我盡我所能從教程中學習,但在C++中有很多不同類型的字符串。

什麼是最快的方法來設置strVal,如果值的類型是char*

DataCollection.h

extern "C" __declspec(dllexport) void GetContCollection(int CollectionLength,int StrLength, DataContainer** Collection); 

typedef struct { 
int iValue; 
char* strValue; 
}DataContainer; 

DataCollection.cpp

extern "C" __declspec(dllexport) void GetContCollection(int CollectionLength,int StrLength, DataContainer** Collection) 
{ 
    *Collection = (DataContainer*)LocalAlloc(0, CollectionLength * sizeof(DataContainer)); 
    // say i need to get a record from database returning a char array 
    // and i use current datatype 
    *DataContainer CurElement = *Collection; 

    // iteration on each element of the collection 
    for(int i=0, i< CollectionLength; i++, CurElement++) 
    { 
     char* x = getsomeValuefromSystemasChar(); 

     //.... how to assign CurElement->strValue=? 
     CurElement->strValue =// kind of Allocation is needed or ....just assign 
     //next, do i have to copy value or just assign it ? 
     CurElement->strValue = x or strcpy(dest,source)// if copying must take place which function would be the best? 
    } 
} 

什麼是正確的,最優化方式來設置CurElement

+1

分配字符串中最昂貴的部分是複製內容,而且無論您如何構造代碼,這都幾乎相同。那麼爲什麼不使用'std :: string'? – Barmar

+1

@Barmar在'GetValue()'是'char *'時是否正確? –

+0

這取決於返回值的代碼。保存指針是否安全,或者系統是否可以重用或釋放內存? – Barmar

回答

2

對該問題的評論和編輯已使這個答案大量廢棄。我純粹爲任何可能瀏覽編輯歷史的人保留它。保持有效的部分在本答案的末尾。

如果如問題所述,結構中的所有 char *都會引用字符串文字,則不需要分配內存,或者在分配時不需要特殊步驟。

字符串文字具有靜態存儲持續時間,因此您可以將其地址指定給指針,並且一切都會正常。你不希望允許任何人以意外寫入字符串字面量雖然如此,通常要使用指針來const

typedef struct { 
    int iValue; 
    char const * strValue; 
} DataContainer; 

然後,當你需要分配,只分配:

extern "C" __declspec(dllexport) void GetContCollection(int CollectionLength,int StrLength, DataContainer** Collection) 
{ 
    // ... 
    CurElement->strValue = "This is a string literal"; 
} 

你可以計算(絕對)字符串文字具有靜態存儲時間,所以毫無疑問,這將工作。既然你只是分配一個指針,它也會很快。

不幸的是,它也有點脆弱 - 如果有人在這裏指定字符串字面以外的東西,它可以很容易地中斷。

這給我們帶來了下一個問題:你是否真的在處理字符串文字的所有。儘管您特別詢問了字符串文字,但您演示的演示代碼看起來並不像是處理字符串文字 - 如果不是,則上面的代碼將會崩潰。

如果你要處理的是,

我想說的只是使用std::string。如果你自己堅持這樣做,那麼你很有可能會產生一些破壞性的事情,而且幾乎沒有(幾乎沒有)機會在不破壞任何事情的情況下獲得實質性的速度優勢。

+0

首先非常感謝。 「如果有人在這裏指定了一個字符串字面以外的東西,它可以非常容易地打破它。」< - 如果這不會發生,那麼我會確保只有char或其他字符「OLECHAR」或「LPOLESTR」等字符。 ,沒有其他類型會受到攻擊。在那種情況下,它仍然有風險嗎? –

+0

@PblicHieipHagAna:這裏的重點是* literal *。只是做一個簡單的分配取決於一個事實,即一個字符串*文字*具有靜態存儲時間。大多數其他字符串不*有*靜態存儲持續時間,這將打破這一點。如果你正在處理'OLECHAR'或'LPOLESTR'等,那麼你幾乎沒有機會處理string * literals *,在這種情況下這將會中斷。 –

+0

「你演示的演示代碼看起來不像是在處理字符串文字_」請在這裏我不知道你所指的是什麼。 –