Tôi có hai đề xuất về cách loại bỏ chức năng cuộc gọi ảo của bạn, nếu cần thiết cho hiệu suất. Vì mục đích minh họa, giả sử bạn có một chức năng tham gia một con trỏ hàm như một cuộc tranh cãi:
void my_algorithm(int (*func)(...), ...)
{
/* ... */
}
Và cũng giả sử bạn biết trước tất cả các giá trị có thể con trỏ chức năng có thể thực hiện. Ví dụ:
my_algorithm(func_1, ...);
//...
my_algorithm(func_2, ...);
Đầu chuyển đổi my_algorithm ban đầu của bạn() vào một macro:
#define MY_ALGORITHM(func, ...) \
{ \
/* ... */ \
}
Sau đó viết lại my_algorithm() như:
extern int func_1(...);
extern int func_2(...);
void my_algorithm(int (*func)(...), ...)
{
if (func == func_1)
MY_ALGORITHM(func_1, ...)
else if (func == func_2)
MY_ALGORITHM(func_2, ...)
else
assert(0 && "Unexpected function arg to my_algorithm()");
}
này tất nhiên sẽ tăng gấp đôi kích thước của tệp đối tượng được biên dịch. Và, trên bề mặt, nó loại bỏ chỉ có một mức độ bất định. Nhưng nếu func_1 và/hoặc func_2 được gạch chân, bạn có thể tăng tốc đáng kể.
Và bạn thậm chí có thể 'vượt qua' macro, như trong:
#define HYPOT_Y(x) hypot(x, y)
MY_ALGORITHM(HYPOT_Y, ...); //assumes y is known
Đề nghị thứ hai là một biến thể của việc này, sử dụng X Macros (http://en.wikipedia.org/wiki/C_preprocessor#X-Macros). Thay vì #define, hãy đặt phần thân của my_algorithm gốc() vào một tệp riêng biệt, my_algorithm.h. Sau đó viết lại my_algorithm() dưới dạng:
void my_algorithm(int (*func)(...), ...)
{
if (func == func_1)
#define func func_1
#include "my_algorithm.h"
#undef func
else if (func == func_2)
#define func func_2
#include "my_algorithm.h"
#undef func
else
assert(0 && "Unexpected function arg to my_algorithm()");
}
Tôi có thể sử dụng macro X nếu mã nhiều hơn một vài chục dòng. lợi thế của mình bao gồm (không ý định chơi chữ):
- Không backslashes xấu xí
- gỡ lỗi dễ dàng hơn (ví dụ dấu vết trở lại và đơn bước).
Đây là tất cả tiêu chuẩn C. Nhưng đúng là trường cũ.
Vâng, đó là một lựa chọn Tôi đã xem xét, nhưng tôi đã suy nghĩ về một cái gì đó đơn giản hơn, tôi không nghĩ rằng Tôi cần toàn bộ JIT, chỉ cần dán một số chức năng với nhau như thể chúng chỉ là một chức năng lớn. Thanks anyway :-) – fortran