草庐IT

c++ - 从未执行过的代码中的微小更改如何产生影响?

我有一个非常奇怪的问题,由于我无法发送代码,所以我会尝试解释一下。这更像是哲学问题-我希望有人有时间/知识来思考这个问题。1)我的project.cpp看起来完全像这样:#include#includepthread_tpplayer_thread;void*play(void*);intmain(intargc,char**argv){pthread_create(&pplayer_thread,NULL,play_cb,NULL);usleep(5000000);return0;}2)pplayer.cpp看起来像这样:...void*play_cb(void*arg){//thi

c++ - 你有没有写过没有守卫的标题?

我想知道为什么C++编译器不为header自动生成header保护?//WhydoIhavetowritethisforevery.hppfileIcreate?!!#ifndefmyheader_hpp__#definemyheader_hpp__//...#endif我还没有遇到过在我编写标题时不需要它们的情况。我看不到相反行为的真实用例,但我很高兴看到一个。是有技术上的困难还是只是历史?! 最佳答案 有somepreprocessortricksthatrequirethesameheaderincludedmultiplet

c++ - 为什么在 C++ 中为执行线程从未遇到过的局部变量声明分配堆栈空间?

为什么在C++中为执行线程从未遇到过的局部变量声明分配堆栈空间?或者,如果C++标准未定义,为什么某些编译器会为执行线程从未遇到过的局部变量声明分配堆栈空间?编译器能否只为执行线程遇到的变量声明分配堆栈空间并仍然工作?为了说明,在无法遇到变量字符的Debug模式下调用此函数会导致堆栈溢出:voidf(){if(false){charchars[INT_MAX];}} 最佳答案 编译器已经提升了局部变量的声明。是否完成此操作未由标准定义,因此该行为是特定于实现的。这样做允许一次为所有局部变量分配空间,从而减少开销。但是,通过优化,编译

c++ - 调用不通过空指针访问成员的非静态方法是否合法/定义明确的 C++?

我最近遇到了以下代码:classFoo{public:voidbar();//..otherstuff};voidFoo::bar(){if(!this){//..dosomestuffwithoutaccessinganydatamembersreturn;}//..donormalactionsusingdatamembers}代码可以编译,因为在C++中,方法只是隐式传递一个指向“this”的指针的函数,并且可以像任何其他指针一样检查“this”是否为NULL。很明显,这段代码很困惑,而且是不好的做法,即使它不会崩溃;在调试器中单步执行代码会非常困惑,看到一个NULL指针即将调用

c++ - 在 C++ 中通过实例对象调用静态方法的警告

我知道通过实例对象调用静态方法是explicitlyallowed.但是如果我想手动避开,调用发生时如何警告我呢?我的意思是,是否有一些编译器选项(或一些特殊属性)来检查情况?我正在使用Clang,但也欢迎使用任何其他编译器特定功能。 最佳答案 答案是否定的。根据其他问答,标准要求并允许这种行为。参见n3797s9.4/2:AstaticmembersofclassXmaybereferredtousingthequalified-idexpressionX::s;itisnotnecessarytousetheclassmembe

c++ - 是否为地址从未使用过的静态常量变量分配了内存?

如果我从不使用静态常量变量的地址,那么在使用相当现代的编译器时是否会为其分配内存? 最佳答案 这取决于变量的类型,以及“常量”是否也意味着“常量表达式”。示例:staticconstFoo=get_foo(std::cin);staticconstintq=argc*3;staticconststd::strings(gets());这些变量是常量,但明显需要实际分配。另一方面,以下常量表达式可能永远不会有物理存储:staticconstintN=1000;staticconststd::shared_ptrvp();//const

c++ - C++11中通过pthreads获取线程Core affinity

我正在尝试在C++11中使用std::thread时设置核心关联(线程#1在第一个核心上运行,线程#2在第二个核心上运行,...)。我已经在各种主题和互联网上进行了搜索,似乎C++11API不提供这种低级功能。另一方面,pthreads带有pthread_setaffinity_np如果我能得到我的std::thread的“pthread_t”值,这将很有用(我不知道这是人类合理的还是至少是合理的要求)。我最终想要的示例程序是这样的:#include#include#include#include#include#defineCORE_NO8usingnamespacestd;void

c++ - 在 C++ 中通过引用选项传递

我想通过引用(在广义上,即通过A&或通过A*)将A类的对象(称为a)传递给另一个B类的构造函数。我不希望“a”到在B中修改('a'是只读的,它的大小很大,这就是我想通过引用传递它的原因)。我知道有两种选择:1)传递'a'作为constA&a_2)传递'a'作为constA*a_选项1的缺点是我可能会错误地传递r值。选项2的缺点是我可能会错误地传递空指针。我的问题是:1)我对上述缺点是否正确?2)是否有另一种推荐的通过引用传递'a'的方法?我在下面的链接中看到了答案。但是我很好奇是否还有其他选项而不是该问题中发布的选项。Aretherebenefitsofpassingbypointer

c++ - 为什么在 C++ 中通过空指针 "work"调用方法?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:CallingclassmethodthroughNULLclasspointer#includeusingnamespacestd;classtest{inti;public:test():i(0){coutshow();return0;}很明显,不会调用任何构造函数。这是标准吗?或者只是一些编译器优化,因为这个指针没有在show()成员函数中使用?

c++ - 为什么将使用过的变量转换为 void

我目前正在查看FAST的OpenCV实现,偶然发现了一些被转换为void的变量。我知道这用于在未使用变量时消除lint/编译器警告。但在这种情况下使用了变量。它可能与SSE有关,因为它只发生在那些代码部分。#ifCV_SSE2__m128idelta=_mm_set1_epi8(-128),t=_mm_set1_epi8((char)threshold),K16=_mm_set1_epi8((char)K);(void)K16;(void)delta;(void)t;#endif以后的用法(编辑):#ifCV_SSE2...__m128iv1=_mm_xor_si128(_mm_sub