Trong hầu hết các trường hợp nếu tôi muốn tạo ra một tính năng tùy chọn trong C, tôi chỉ cần tạo hai chức năng như thế này:Tại sao GCC giữ các chức năng trống?
#ifdef OPTIONAL_SOMETHING
void do_something(int n, const char *s)
{
while (n--) {
printf("%s", s);
}
/* ...You might get the point, really do something... */
}
#else
void do_something(int n, const char *s)
{
/* Empty body */
}
#endif
Vì vậy, nếu các biểu tượng là undefined - khi tính năng bị vô hiệu hóa - một chức năng có sản phẩm nào được biên dịch vào thực thi.
Chuyển vào danh sách lắp ráp, có vẻ như GCC biên dịch và gọi chức năng trống khi tối ưu hóa bị tắt. Nếu tối ưu hóa được bật, cũng với -O2
và -O3
, nó chỉ biên dịch mã xử lý ngăn xếp cần thiết, nhưng nó tối ưu hóa hướng dẫn cuộc gọi. Tất cả trong tất cả nó giữ chức năng.
Giới thiệu tương tự cũng áp dụng cho các phương pháp không trống, nhưng không được sử dụng.
Nó chỉ đơn giản là sẽ ném ra toàn bộ điều, nhưng nó không. Tại sao nó là hành vi mặc định? Và chỉ vì tò mò: Làm thế nào tôi có thể loại bỏ điều này?
"Nếu tối ưu hóa được bật, cũng với -O2 và -O3 nó chỉ biên dịch mã xử lý ngăn xếp cần thiết, nhưng nó tối ưu hóa hướng dẫn cuộc gọi." Điều này có nghĩa là vẫn còn một số chi phí theo cách này? 'start_timer(); do_something(); stop_timer();' mất nhiều thời gian hơn 'start_timer(); stop_timer();'? –