std::string
不是編譯時類型(它不能是constexpr
),所以你不能直接使用它來確定編譯時的長度。
你可以初始化一個constexpr
char[]
,然後在使用sizeof
:
constexpr char messychar[] = "a bunch of letters";
// - 1 to avoid including NUL terminator which std::string doesn't care about
constexpr size_t messylen = sizeof(messychar)/sizeof(messychar[0]) - 1;
const string messy(messychar);
和使用,但坦率地說,這是相當醜陋的;該長度將是編譯時間,但organized
需要使用count
和char
構造函數,該函數仍將在每次調用時執行,只分配和初始化僅在循環中替換內容。
雖然它不是編譯的時候,你會避免初始化成本只要使用reserve
和+=
建立新的string
,它與#define
可以在一個醜陋的,但可能有效的方式完成:
constexpr char messychar[] = "a bunch of letters";
constexpr size_t messylen = sizeof(messychar)/sizeof(messychar[0]) - 1;
// messy itself may not be needed, but if it is, it's initialized optimally
// by using the compile time calculated length, so there is no need to scan for
// NUL terminators, and it can reserve the necessary space in the initial alloc
const string messy(messychar, messylen);
string dostuff(string sentence) {
string organised;
organized.reserve(messylen);
for (size_t x = 0; x < messylen; x++) {
organised += sentence[x]++; // Doesn't matter what this does.
}
}
這避免了多次設置organised
的值,每次調用分配多次(如果初始構建執行的話可能會多次),並且只執行一次讀寫通道sentence
,沒有完整讀取,然後讀取/寫或諸如此類。它還使循環約束成爲編譯時間值,因此編譯器有機會展開循環(雖然不能保證這一點,即使發生這種情況,也可能沒有幫助)。
另請注意:在你的例子中,你改變了sentence
,但它被值接受,所以你要改變本地副本,而不是調用者副本。如果需要調用者值的變異,請通過引用接受它,如果不需要變異,請通過const
引用來避免在每次調用時都複製(我理解示例代碼是填充符,只是提到了這一點)。
'std :: string'具有'append' /'+ ='。 – Michael
Michael。我不明白?我不想追加任何東西。我想在編譯時導出字符串長度。您的示例在編譯時如何工作? –