草庐IT

c++ - 我可以从外部访问函数内部的静态变量吗

C/C++:我可以从外部访问函数内部的静态变量吗?例如:#includeusingnamespacestd;voidf(){staticintcount=3;cout 最佳答案 不,你不能,无论是在C中还是在C++中。如果要维护与函数关联的状态,请定义一个具有适当状态和成员函数的类。(在C++中。您还用C标记了问题;同样的技术有效,但您需要自己完成所有基础工作。)虽然它们有它们的用途,但大多数时候非常量静态局部变量不是一个好主意。它们使您的函数线程不安全,并且通常使其成为“调用一次”。

c++ - 我可以将 boost::threadpool 用作 'thread-safe queue' 吗?

我需要的实际上是一个线程安全的队列结构,其中多个客户端不断将数据转储到队列中,一个工作线程不断处理并弹出队列STL或Boost中是否存在任何成熟的解决方案?我现在考虑使用Boost::threadpool来做这件事。只需将并行线程数设置为1,每次有新消息从客户端到达时,任务函数的输入参数都会更改。这是否有意义,这里是否存在我尚未预料到的任何限制? 最佳答案 在boost中有一个messagequeueclass,这就是您所需要的:一个线程安全的队列。消息队列是一个广泛用于进程间通信的概念。消息队列是线程安全的队列,其主要特点是它会阻

c++ - 当我从公共(public)成员函数返回引用时,为什么我可以暴露私有(private)成员?

在代码片段中,我能够访问类范围之外的私有(private)成员变量。虽然永远不应该这样做,但为什么在这种情况下允许这样做呢?通过引用接收返回的私有(private)变量是一种不好的做法吗?#include#includeclassfoo{intx;public:foo(inta):x(a){}intmethodOne(){returnx;}int&methodTwo(){returnx;}};intmain(){fooobj(10);int&x=obj.methodTwo();x=20;//Withthisstatement,modifyingthestateofobj::xstd::

c++ - 为什么我可以从全局范围调用私有(private)构造函数?

此代码编译和运行没有错误:classfoo{staticfoo*ref;foo(){}public:staticfoo*getRef(){returnref;}voidbar(){}};foo*foo::ref=newfoo;//theconstrucrtorisprivate!intmain(intargc,constchar*argv[]){foo*f=foo::getRef();f->bar();return0;}谁能解释一下为什么可以调用构造函数? 最佳答案 该范围不是全局的-静态成员在类范围内,因此它们的初始化表达式也在类

c++ - 我可以将代码放在 case 之外的 switch 中吗?

假设:switch(test){//Setsomevariables,callsomefunctions?intx=1;inty=function(x);//case1://Processfortest=1...break;case5://Processfortest=5...break;default://Processforallothercases....}执行我在第一个case之前添加的额外代码是否“合法”?我从未在示例中看到过这一点。 最佳答案 首先是关于switch(真正)如何工作的一些背景知识:switch通常被认为是

c++ - 我可以在 C++ 中扩展变体吗?

我不确定这是否可能,但假设我有:usingmy_variant=std::variant;现在,我创建了一个Class4并想延长my_variant2包括所有my_variant连同Class4(以一般方式,即不只是使用另一个using...)这样我就可以做一些事情,比如创建一个数组std::array.这是可以做到的吗? 最佳答案 godbolted#includetemplatestructconcatenator;templatestructconcatenator,Args1...>{usingtype=std::varia

c++ - 在 64 位机器上,我可以安全地并行操作 64 位四字的各个字节吗?

背景我正在对图像中的行和列进行并行操作。我的图像是8位或16位像素,我在64位机器上。当我对列进行并行操作时,两个相邻的列可能共享相同的32位int或64位long。基本上,我想知道我是否可以安全地并行操作同一四字的各个字节。最小测试我写了一个最小的测试函数,但我无法使它失败。对于64位long中的每个字节,我在p阶的有限域中同时执行连续乘法。我知道Fermat'slittletheorema^(p-1)=1modp当p为质数时。我为我的8个线程中的每一个改变值a和p,并且我执行k*(p-1)乘法一个。当线程完成时,每个字节都应该为1。事实上,我的测试用例通过了。每次运行时,我都会得到

c++ - 我可以将此宏更改为内联函数而不影响性能吗?

(编辑:让我们将其命名为“测量如何出错的教训。”但我仍然没有弄清楚究竟是什么导致了差异。)我发现了一个非常快的整数平方根函数here通过马克·克朗。至少在我的机器上使用GCC,它显然是我测试过的最快的整数平方根函数(包括Hacker'sDelight、thispage和标准库中的floor(sqrt())中的函数)。稍微清理一下格式、重命名变量并使用固定宽度类型后,它看起来像这样:staticuint32_tmcrowne_isqrt(uint32_tval){uint32_ttemp,root=0;if(val>=0x40000000){root=0x8000;val-=0x4000

c++ - 我可以使用相同的名称为周围范围内的类型声明一个成员类型别名吗?

出于元编程的目的,我希望结构包含另一种类型的类型别名:structFoo{};structWithNestedTypeAlias{usingFoo=Foo;};然后我可以在模板中执行诸如WithNestedTypeAlias::Foo等操作据我所知,这个类型别名是有效的,因为它不会改变Foo类型的含义。Clang愉快地编译了这个。但是,GCC提示:test-shadow-alias.cpp:4:20:error:declarationof‘usingFoo=structFoo’[-fpermissive]usingFoo=Foo;^test-shadow-alias.cpp:1:8:e

c++ - 我可以使用 std::vector 作为预分配(原始)数组的外观吗?

我已经从DirectX获得了一个内存位置,其中存储了我的顶点信息。处理顶点信息的一种极其方便的方法是使用包含顶点信息的结构的std::vector。鉴于我有一个指向大缓冲区的指针,我可以使用std::vector来管理缓冲区中的元素吗?定期构造一个std::vector会导致它有自己的地址,这并不是我真正想要的。我能以某种方式使用新的运算符放置吗? 最佳答案 是的,你可以。使用customallocator.在此分配器中,您的DirectX内存的返回地址。这是一个基于CompellingexamplesofcustomC++STLa