草庐IT

应不应该

全部标签

c++ - boost库应该依赖于结构成员对齐吗?

我发现,hardway,至少boost::program_options依赖于编译器配置的结构成员对齐。如果您使用默认设置构建boost并将其与使用4字节对齐(/Zp4)的项目链接,它将在运行时失败(使用program_options进行了最小测试)。Boost将生成一个断言,指示可能存在错误的调用约定,但真正的原因是结构成员对齐。有什么办法可以避免这种情况吗?如果对齐导致代码不兼容,难道不应该将其包含在库命名中吗? 最佳答案 您需要确保您的程序和链接的库具有相同的ABI。可以改变C++类和函数的ABI的编译器开关的数量可能太大,因

c++ - 我应该用 emplace_back 替换所有对 push_back 的调用吗?

在我的C++应用程序中,我大量使用像vector这样的STL容器。对push_back的调用很多,我一直担心不必要的构造和复制操作。我的应用程序非常低级,我非常关心CPU和内存使用情况。我是否应该将所有对push_back的调用替换为对emplace_back的调用?我正在使用VisualStudio2013。 最佳答案 我将对push_back的所有调用替换为对emplace_back的调用,并注意到以下内容:RAM使用量减少了大约20%(更新:这可能是由于其他影响)CPU使用率没有变化二进制文件稍小(x64)没有兼容性问题根据这

c++ - 为什么我们应该将 `std::unique_lock` 放在本地范围内?

基于C++EquivalenttoJava'sBlockingQueuevoidpush(Tconst&value){//originalversion{std::unique_locklock(this->d_mutex);d_queue.push_front(value);}this->d_condition.notify_one();}voidpush(Tconst&value){//myquestion//{//commentoutthescopestd::unique_locklock(this->d_mutex);d_queue.push_front(value);//}/

c++ - 当我使用带有整数的 C++ 数学函数时,我应该担心精度吗?

例如,由于float的精度,下面的代码会产生不希望的结果。doublea=1/3.0;intb=a*3;//bwillbe0here我想知道如果我使用数学函数是否会出现类似的问题。例如inta=sqrt(4);//DoIhaveguaranteethatIwillalwaysget2here?intb=log2(8);//DoIhaveguaranteethatIwillalwaysget3here?如果不是,如何解决这个问题?编辑:其实我在为一个算法任务编程的时候遇到过这个问题。在那里我想得到thelargestintegerwhichispowerof2andislessthano

c++ - C++ ABI 是否指定 vTable 和 RTTI 信息应该如何存在?

像GCC/VC这样的流行实现使用多态对象的第一个size_t空间作为指针,指向一个vtable结构。这是最新的C++ABI的一部分吗?RTTI的实现如何,C++ABI有没有规定如何实现?谢谢 最佳答案 不,C++标准没有指定这些应该如何实现。没有单一的C++ABI。 关于c++-C++ABI是否指定vTable和RTTI信息应该如何存在?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

c++ - 我应该使用单个 header 来包含所有静态库 header 吗?

我有一个用C++构建的静态库。我把它分成许多头文件和源文件。我想知道是否最好将库的客户端可能需要的所有header包含在一个头文件中,然后他们可以将其包含在他们的源代码中,或者只让它们包含他们需要的header?这会导致代码不必要地臃肿吗?我不确定未使用的类或函数是否仍会编译到他们的产品中。感谢您的帮助。 最佳答案 请记住,您编译的每个源文件都涉及编译器的独立调用。每次调用时,编译器都必须读入每个包含的头文件,对其进行解析,并建立一个符号表。当您在许多源文件中使用其中一个“includetheworld”头文件时,它会显着影响您的构

c++ - lambda:应该通过引用捕获 const 引用产生未定义的行为吗?

我刚刚在我的代码中发现了一个讨厌的错误,因为我通过引用捕获了对字符串的const引用。当lambda运行时,原始字符串对象早已不复存在,引用的值是空的,而目的是它将包含原始字符串的值,因此出现错误。让我感到困惑的是,这并没有在运行时引发崩溃:毕竟,这不应该是未定义的行为,因为afaik有一个悬空引用吗?此外,在调试器下查看id时,它看起来甚至不像垃圾,而是像一个正确构造的空字符串。这是测试用例;这只是打印一个空行:typedefstd::vector>functions;voidAddFunction(conststd::string&id,functions&funs){funs.p

c++ - 我应该明确地零初始化 auto_ptr 吗?

我的一些同事更喜欢在构造函数初始化列表中将std::auto_ptr显式初始化为0,但它会被初始化为0在它的构造函数中没有任何显式初始化。那么有什么理由这样做吗?#includeclassA{A():SomePtr(0){}private:std::auto_ptrSomePtr;}; 最佳答案 不,std::auto_ptr的默认构造函数正是这样做的,因此没有必要显式地这样做。无论如何,这是风格问题,您应该保持一致。例如,您是否会在构造函数初始化列表中显式调用成员vector的默认构造函数?作为旁注,std::auto_ptr在即

c++ - 我应该使用指向 std::string 的指针吗

在学习c++时,我首先使用Qt库,而不是标准的C++、STL等等(好吧,所以我是c++的新手,被Qt宠坏了)。在Qt上,QString使用隐式共享,这样我就可以将它复制分配给另一个变量,例如:QStringvar1=QString("Hithere!");QStringvar2=var1这会做得很好,没有太多开销。但是现在,我正在尝试std::string所以,我应该这样做吗std::stringvar1=std::string()或std::string*var1=newstd::string()另外,QVector和std::vector怎么样。如果我确实必须使用指针……有什么提示

c# - 我们应该把枚举放在哪里?

很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭10年前。当我用Java开发时,一个总是困扰我的简短问题。我实际上使用了很多不同的枚举,但我不确定应该把它们放在哪里。通常,我会创建一个名为enumeration的特殊包,我很确定这不是最佳做法。我应该将我的枚举直接放在与它最属于的类组相同的包中吗?此外,对于另一种语言(C#或C++)是否也一样?