gpt4 book ai didi

c++ - 使用const bool删除调试信息时的编译器优化

转载 作者:行者123 更新时间:2023-12-02 10:00:06 29 4
gpt4 key购买 nike

我有一个名为log(std::string s)的调试函数的类
我正在一个小型嵌入式系统上工作,因此我想从二进制文件中删除不必要的字符串。
我可以使用#define实现我想要的功能,但是我认为这是一个坏习惯。使用-Os优化,我可以像这样使用const bool:

#include <cstdio>
#include <string>
#include <iostream>

class test
{
const bool enable_debug = false;
void log(std::string s)
{
if (enable_debug) printf("%s",s.c_str());
}

public:
void doStuff(int i)
{
log("I don't want this string to appear in the binary output");
}
};

int main()
{
test instance;
char input;
std::cin>>input;
instance.doStuff(input);
}
请在此处查看输出: https://godbolt.org/z/qz7csf
。如您所见,即使无法使用该字符串,也不会从assemby生成的代码中删除该字符串,因为enable_debug是const。
  • 那么为什么它仍在输出中?
  • 如何在不使用#define的情况下创建切换开关?

  • PS:最后,我想在类外部添加bool变量,以便同时切换所有类。

    最佳答案

    您正在使用std::string。编译器不够聪明,无法看清所有std::string机制,而且我怀疑它甚至可以消除std::string的构造。由于字符串文字用于初始化std::string,因此文字也无法消除。
    如果要节省一些字节,则可以考虑使用using const char* instead

    关于c++ - 使用const bool删除调试信息时的编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63036350/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com