草庐IT

c++ - 在大型 C++ 项目中处理配置的最佳方式

为了启动我的C++程序,我需要阅读一些配置,例如IP地址、端口号、文件路径...这些设置可能会非常频繁地更改(每周或每天!),因此将它们硬编码到源文件中并不是一个好主意。经过一些研究,我对是否存在从文件加载配置设置并使这些配置可用于同一项目中的其他类/模块/*.cpp的最佳实践感到困惑。静态不好;单例不好(反模式?)那么,我们还有哪些其他选择?或者,也许“配置文件”的想法是错误的?编辑:我加载配置文件没有问题。我担心的是,在将所有这些设置加载到内存中的std::map之后,如何让其他类、函数访问这些设置。编辑2:感谢大家的投入。我知道我在此处列出的这些模式很好,并且它们被许多程序使用。

c++ - 为什么释放堆内存比分配它慢得多?

这是一个经验假设(分配比取消分配更快)。这也是一个的原因,我猜,为什么基于堆的存储(如STL容器或其他)选择不将当前未使用的内存返回给系统(这就是shrink-to-fit习语诞生的原因。当然,我们不应该将“堆”内存与类似“堆”的数据结构混淆。那么为什么取消分配速度较慢?它是Windows特定的(我在Win8.1上看到它)还是独立于OS?是否有一些C++特定的内存管理器自动参与使用“new”/“delete”或整个内存。管理完全依赖于操作系统?(我知道C++11引入了一些垃圾收集支持,我从来没有真正使用过,最好依赖旧的stack和staticduration或self管理的容器和RAI

c++ - 最令人烦恼的解析是否带有合格的 id?

考虑:structFoo{enum{bar};explicitFoo(int){}};structBaz{explicitBaz(Foo){}};Bazb(Foo(Foo::bar));//#1即使Foo::bar是一个qualified-id并且不可能是一个有效的参数名称,第1行是最令人烦恼的解析吗?ClangandGCCdisagree;哪个编译器是正确的? 最佳答案 Clang是对的。有点令人惊讶的是,parameter-declaration的语法允许qualified-和unqualified-id,因为它接受所有声明符:

c++ - Gcc 隐藏来自包含的静态库的符号的可见性

我有:一个共享库,比如libShared.so,它包含一个类Bar,带有一个方法intBar::do(intd)const一个静态库,比如libStatic.a,它包含一个类Foo,带有一个方法intFoo::act(inta)const。Bar的代码是这样的://Bar.hclass__attribute__((visibility("default")))Bar{private:__attribute__((visibility("hidden")))intprivateMethod(intx)const;public:Bar(){}intdo(intd)const;}//Bar.

c++ - 异或编程难题建议

给定一个longintx,计算a满足以下条件的值的个数:aXORx>x0一个x其中a和x是长整数,XOR是按位异或运算符你会如何完成这个问题?我还应该提到输入x可以大到10^10我已经设法通过迭代0到x检查条件并增加计数值来获得蛮力解决方案。但这不是最佳解决方案......这是我试过的蛮力。它有效,但对于大的x值非常慢。for(inti=0;ix)count++;} 最佳答案 longlongNumberOfA(longlongx){longlongt=x%lld\n",10LL,NumberOfA(10LL));printf("%

c++ - 继承和多态性——易用性与纯粹性

在一个项目中,我们的团队正在使用对象列表对应该以类似方式处理的数据集执行大量操作。特别是,不同的对象在理想情况下会表现出相同的行为,这很容易通过多态性来实现。我遇到的问题是继承意味着是一种关系,而不是具有关系。例如,几个对象有一个伤害计数器,但为了使其易于在对象列表中使用,可以使用多态性——除非这意味着一个是一个关系不会是真的。(人不是伤害计数器。)我能想到的唯一解决方案是让类的成员在隐式转换时返回正确的对象类型,而不是依赖继承。放弃是一个/有一个的理想以换取编程的便利会更好吗?编辑:更具体地说,我正在使用C++,因此使用多态性将允许不同的对象在派生类可以驻留在单个列表中并由基类的虚函

c++ - 在命名空间中调用静态函数时出错

我收到以下错误:x.h:3:13:warning:‘intX::foo()’usedbutneverdefined/tmp/ccK9qSnq.o:Infunction`main':main.cpp:(.text+0x7):undefinedreferenceto`X::foo()'collect2:error:ldreturned1exitstatus同时构建以下代码:main.cpp#include"x.h"intmain(){X::foo();}x.hnamespaceX{staticintfoo();}x.cpp#include"x.h"namespaceX{intfoo(){r

c++ - 通过 copy 和 decltype 捕获 Lambda 引用

考虑简单的程序:inti=0;int&j=i;autolambda=[=]{std::cout根据[expr.prim.lambda],闭包成员变量j的类型应该是int:Anentityiscapturedbycopyifitisimplicitlycapturedandthecapture-defaultis=orifitisexplicitlycapturedwithacapturethatisnotoftheform&identifieror&identifierinitializer.Foreachentitycapturedbycopy,anunnamednon-static

c++ - 'private'访问修饰符是否给了编译器更大的优化空间?

它是否允许编译器内联它,知道只有同一个类中的函数才能访问它?还是只是为了程序员的方便? 最佳答案 编译器可以(但不是必须)按照您的建议进行优化,但这不是要点。访问修饰符的目的是在编译时捕获某些类(没有双关语)的编程错误。私有(private)函数是这样的函数,如果有人从类外部调用它们,那将是一个错误,您希望尽早了解它。(任何时候你问“编译器是否可以根据可用的信息进行优化”这个问题,答案都是“是的,除非标准中有特定的规则说不允许”(例如volatile的规则,其全部目的是抑制优化)。然而,编译器不一定打扰根据任何给定的信息进行优化。毕

c++ - operator const Base&() 是否应该用于不可访问的基类?

我希望有一个类允许访问其基本情况的const接口(interface),但不允许访问其他类。特别是:classB{};classA:privateclassB{public:operatorconstB&(){return*this;}};intmain(){Aa;constB&b=a;//Shouldthislinebeanerror?}g++给出了一个不可访问的基类错误。你们那里的语言专家认为这个错误在C++11/C++14中是正确的吗?是的,我意识到我可以(并且将会)这样做:intmain(){Aa;constB&b=a.operatorconstB&();}对这个构造的另一种方