如果我有一個包含一堆其他代碼的模板。 g ++是否會重新生成對於每個版本的模板都相同的所有代碼?g ++模板實例化器有多聰明(避免模板膨脹)
例如:
template <typename> T
T parseSomething(const std::string& data) {
// Some state variables go here
enum State {state1,state2,state3} state;
for(std::string::const_iterator i=data.begin();i!=data.end();++i) {
// Some big testy stuff to see if we got in the right place
switch (state) {
case state1: {
switch (*i) {
case f: // ...
// ... lots of switchy stuff here ..
return T(*i);
}
}
所以在這FUNC ..真正需要的模板的唯一位是返回T(* I)線。
假設我用4個不同的Ts例化它。
parseSomething<float>(data);
parseSomething<int>(data);
等
會克++生成所有其它代碼(環和開關部件),用於每T單獨的時間?或者它會足夠聰明,只生成開關和循環一次..然後爲每個T ..生成返回T(* i);線?
我嘗試過使用-O0進行測試,但它確實複製了各處的開關,但是-O2和以上版本很難說;它似乎是聰明..但它是如此聰明,我無法破譯ASM :)
這是我想要使用來測試我的示例程序。
編譯:
g++ -std=c++0x -fverbose-asm -ggdb3 -fvar-tracking-assignments -O6 -march=native codegen.cpp
運行:
gdb --args ./a.out asdf1111
偏執代碼版本:
#include <iostream>
#include <string>
using namespace std;
char getSomething(const string& myString) {
for(auto myPlase=myString.begin();myPlase!=myString.end();++myPlase) {
if (*myPlase == 'f') {
return *(myPlase+1);
}
}
}
template <typename T>
T getSomething(const string& myString) {
return T(getSomething(myString));
}
int main(int argc, char** argv) {
string base = argv[1];
float myFloat = getSomething<float>(base);
int myInt = getSomething<int>(base);
char myChar = getSomething<char>(base);
//string newString = getSomething<string>(base);
cout << myFloat << " " << myInt << " " << myChar << endl;
}
代碼版本我想使用:
#include <iostream>
#include <string>
using namespace std;
template <typename T>
T getSomething(const string& myString) {
for(auto myPlace=myString.begin();myPlace!=myString.end();++myPlace) {
if (*myPlace == 'f') {
return T(*(myPlace+1));
}
}
}
int main(int argc, char** argv) {
string base = argv[1];
float myFloat = getSomething<float>(base);
int myInt = getSomething<int>(base);
char myChar = getSomething<char>(base);
//string newString = getSomething<string>(base);
cout << myFloat << " " << myInt << " " << myChar << endl;
}
在現實世界中,我使用ragel生成代碼,它大約有1200行。我想將它變成一個模板函數,主模板位是返回類型,但我不希望看到爲每種類型重新生成這些1200行。 – matiu 2012-02-19 05:17:31
如果你是GCC,你將如何生成有問題的代碼? – 2012-02-19 06:31:35
當然真正的問題是:在偏執的代碼示例中,調用「getsomething」內聯:)? – 2012-02-19 11:04:02