作者jeunder (omega~ oh my god)
看板CSSE
標題[CPP] compile time 與 run time 之間的代溝
時間Mon Jun 27 17:20:36 2005
假設有個函數 int f(int), 利用此函數計算數列的值 f(0), f(1), ..., f(N-1).
如果 f(n) 的計算很耗費時間, 並且給定 n 值, f(n) 值就可以確定了. 通常我們
會建立表格陣列, 以便之後的多次引用, 不需再重複耗費計算能量
int table[N];
for(int i = 0; i < N; ++i)
table[i] = f(i);
又假設 f(n) 值其實是可以在 compile time 計算出來的, 利用整數模板來計算,
像這樣 f<0>::value, f<1>::value, ..., f<N-1>::value. 這樣一來, 數列的計
算可以在 compile time 完成, 但是產生了新的問題. 原本 f(n) 的計算, n 值
可以在 run time 才決定, 但利用整數模板之後, f<n>::value 的 n 值卻得在
compile time 就決定了, 也就是說, 做以下的事情是不被允許的
cin >> n;
cout << ( f<n>::value );
因為整數模板的整數值無法延到 run time 才決定, 最簡單的解決方法就是做苦工
#define F(n) f<(n)>::value
int table[] = { F(0), F(1), ..., F(N-1) };
但是這樣做就覺得很醜, 每次要改變 N 值的範圍, 就得在編輯器複製貼上. C++語
言似乎缺乏在 source code level 的 for loop (或者說我可以稱此為 coding time
的 for loop), 而在 compile time 的 for loop (整數模板), 卻又被過度限制,
想在 compile time 填寫陣列表格也似乎做不到...?
講到這裡, 講了好多, 好像我是來教導些什麼的? 其實我是來發問問題的 :p
要怎樣才能漂亮的解決以上問題, 在 run time 之前就把表格填好, 並且可在
run time 以動態決定的索引來存取這個表格?
附註1: 只是單純的想討論這個問題, 想知道怎麼做, 至於該不該去這麼做, 或者
適不適當, 並非此處討論的重點.
附註2: 我知道可以用程式寫工具來幫助自己寫程式, 利用工具來轉換或者產生程
式碼, 但是我只想侷限在語言本身的機制, 尋求看看是否有漂亮的解答?
附註3: 突然想到了巨集 #define, 以及那兩個令人昏頭的運算子 # 與 ##, 似乎
是一種可能的解決方案?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.230.219.228
※ 編輯: jeunder 來自: 61.230.219.228 (06/27 18:09)