相关疑难解决方法(0)

未使用代码的开销

我想知道代码中有未使用的函数的开销是多少.

比如说你有一些调试日志记录,然后你给大多数对象一个在调试日志中使用的ToString()函数.

在发布版本中,未使用调试日志记录.是否值得删除那些ToString()函数的源代码?(例如通过宏?)

或者他们只是使可执行文件略大,否则不会影响性能?例如没有速度影响?或者,如果不使用它们,编译器或链接器是否甚至可能删除它们?如果编译器或链接器没有删除代码,那么如果ToString()函数是内联定义的呢?据推测,它会尝试内联代码,因为函数永远不会被调用,它会消失吗?

我想每个函数都需要保留在静态库中,但是一旦编译成可执行文件,链接器肯定会忽略很多东西吗?

另一个注意事项大致相似,如果编译器选择不内联内联函数,以便内联函数在几个编译单元中被定义为函数,那么链接器会丢掉多余的定义,并且最后只链接其中一个?

谢谢

c++ compiler-construction linker function overhead

12
推荐指数
1
解决办法
811
查看次数

绕过#defined'd宏?

假设你有宏

#define TOKEN1 <arbitrary sequence of characters>
Run Code Online (Sandbox Code Playgroud)

但是,假设在某些情况下,你真的是指TOKEN1,而不是它的定义.是否有一个技巧允许预处理文件包含"TOKEN1",没有#unf'ining TOKEN1,并且TOKEN1出现在#define'd之后?

语境:

我正在通过重新定义来添加内存跟踪new.但是,我遇到的问题是我也在operator new几个类中重载了,并且在所有这些地方都必须取消定义新的,然后重新包含执行魔术之后的标题是很尴尬的.

c c++ c-preprocessor

6
推荐指数
1
解决办法
376
查看次数

C/C++未使用的内联函数未定义引用

请考虑以下代码(这不是特定于pthread;其他示例,例如涉及实时库的示例,表现出类似的行为):

#define _GNU_SOURCE
#include <pthread.h>

inline void foo() {
    static cpu_set_t cpuset;
    pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
}

int main(int argc, char *argv[]) { }
Run Code Online (Sandbox Code Playgroud)

这是C和C++中的有效程序.所以,我的这个内容保存到testc.ctestcpp.cpp,并尝试建立.

当我建立时,C++我没有得到任何错误.当我内置时,C我得到一个未定义的引用错误.现在,此错误发生在-O1和中-O3.反正有没有指示gcc做正确的事情(看到它foo是未使用的并跳过定义的要求pthread_setaffinity_np)?

编辑:我认为从上下文来看很明显,但错误信息是:

/tmp/ccgARGVJ.o: In function `foo':
testc.c:(.text+0x17): undefined reference to `pthread_setaffinity_np'
Run Code Online (Sandbox Code Playgroud)

请注意,由于foo未在主路径中引用,因此请g++完全忽略该功能,但gcc不能.

编辑2:让我再试一次.该函数foo和后续调用pthread_setaffinity_np未使用.主要功能是空的.看看吧!不知何故,g++想通了foo不需要包括在内,随后当我们故意省略-lpthread (并检查导出的符号并nm确认既不需要也foo没有参考pthread_setaffinity_np)时,构建过程没有绊倒.由此产生的结果gcc没有发现.

我问这个问题是因为C++和C前端似乎在同一输入上给出了不同的结果.这似乎不是一个ld表面上的问题,因为我希望两个路径都给出相同的链接错误,这就是为什么我强调它似乎是一个编译器问题.如果C++和C都有问题,那么我会同意它是一个链接问题.

c c++ linux gcc ld

2
推荐指数
2
解决办法
4934
查看次数

标签 统计

c++ ×3

c ×2

c-preprocessor ×1

compiler-construction ×1

function ×1

gcc ×1

ld ×1

linker ×1

linux ×1

overhead ×1