Вот как я это сделал, когда несколько месяцев назад написал похожую библиотеку.И да, ваш оптимизатор удалит пустые вызовы встроенных функций.Если вы объявляете их вне строки (не в заголовочном файле), ваш компилятор НЕ встроит их, если вы не используете LTO.
namespace Reporting
{
const extern std::string logFileName;
void Report(std::string msg);
void Report(std::string msg, std::string msgLogAdd);
void Log(std::string msg);
void Message(std::string msg);
#ifdef DEBUG
inline void Debug_Log(std::string message) { return Log(message); }
inline void Debug_Message(std::string message) { return Message(message); }
inline void Debug_Report(std::string message) { return Report(message); }
inline void Debug_Assert(bool test, std::string message) { /* Not sure what to do here */ }
#else
inline void Debug_Log(std::string) {}
inline void Debug_Message(std::string) {}
inline void Debug_Report(std::string) {}
inline void Debug_Assert(std::string) {}
#endif
};
Как примечание, не передавайте строки по значениюесли вам не нужно сделать копию в любом случае.Вместо этого используйте константную ссылку.Это предотвращает дорогостоящее выделение + strcpy в строке для КАЖДОГО вызова функции.
РЕДАКТИРОВАТЬ: На самом деле, теперь, когда я думаю об этом, просто используйте const char *.Глядя на сборку, она намного быстрее, особенно для пустых тел функций.
GCC оптимизирует это при -O1, я не думаю, что есть большая проблема с этим:
clark@clark-laptop /tmp $ cat t.cpp
#include <cstdio>
inline void do_nothing()
{
}
int main()
{
do_nothing();
return 0;
}
clark@clark-laptop /tmp $ g++ -O1 -S t.cpp
clark@clark-laptop /tmp $ cat t.s
.file "t.cpp"
.text
.globl main
.type main, @function
main:
.LFB32:
.cfi_startproc
movl $0, %eax
ret
.cfi_endproc
.LFE32:
.size main, .-main
.ident "GCC: (Gentoo 4.5.0 p1.2, pie-0.4.5) 4.5.0"
.section .note.GNU-stack,"",@progbits
После небольшой настройки кажется, что это будет полное удаление, только если вы используете const char *, NOT std :: string или const std :: string &.Вот сборка для const char *:
clark@clark-laptop /tmp $ cat t.cpp
inline void do_nothing(const char*)
{
}
int main()
{
do_nothing("test");
return 0;
}
clark@clark-laptop /tmp $ g++ -O1 -S t.cpp
clark@clark-laptop /tmp $ cat t.s
.file "t.cpp"
.text
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
movl $0, %eax
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Gentoo 4.5.0 p1.2, pie-0.4.5) 4.5.0"
.section .note.GNU-stack,"",@progbits
А вот с const std :: string & ...
.file "t.cpp"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "test"
.text
.globl main
.type main, @function
main:
.LFB591:
.cfi_startproc
subq $24, %rsp
.cfi_def_cfa_offset 32
leaq 14(%rsp), %rdx
movq %rsp, %rdi
movl $.LC0, %esi
call _ZNSsC1EPKcRKSaIcE
movq (%rsp), %rdi
subq $24, %rdi
cmpq $_ZNSs4_Rep20_S_empty_rep_storageE, %rdi
je .L11
movl $_ZL22__gthrw_pthread_cancelm, %eax
testq %rax, %rax
je .L3
movl $-1, %eax
lock xaddl %eax, 16(%rdi)
jmp .L4
.L3:
movl 16(%rdi), %eax
leal -1(%rax), %edx
movl %edx, 16(%rdi)
.L4:
testl %eax, %eax
jg .L11
leaq 15(%rsp), %rsi
call _ZNSs4_Rep10_M_destroyERKSaIcE
.L11:
movl $0, %eax
addq $24, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE591:
.size main, .-main
[Useless stuff removed...]
.ident "GCC: (Gentoo 4.5.0 p1.2, pie-0.4.5) 4.5.0"
.section .note.GNU-stack,"",@progbits
Огромная разница, а?