草庐IT

c++ - 构建一个 vector 以允许未初始化的存储

假设我想构建一个vector容器,unlikestd::vector,允许未初始化的存储。容器的用法,比如vec,大概是这样的:用户明确声明vector应该像这样分配N个未初始化的元素:veca(N,no_init);在数据已知的某个时刻,用户显式地初始化位置n的元素使用参数args...:a.init(n,args...);或者,等效地,手动构造元素:new(&a[n])T(args...);其他操作可能会进行更大规模的初始化或复制(如std::uninitialized_copy),但这只是为了方便;基本的底层操作是相同的。完成一些任务后,vector可能会留下一些已初始化的元素,

c++ - 通过内存共享 C++ 对象

我有一个简短的问题要问那些熟悉进程间通信的人。情况我有一个程序(程序A),我可以向其中添加一些代码,但非常有限。这是生成大量数据的主程序。数据制定的方式是有限的,所以我想创建第二个程序(程序B),因此需要从A到B获取数据。甚至有时导致A运行一些没有返回值的函数。我知道命名管道,但我觉得它们可能很笨重?-虽然不确定-例如我有以下担忧(可能没有根据):数据流=>转换为二进制->将数据放入内存->服务器读取->转换为字符串->通过可能的switch语句确定请求的内容->获取请求的内容->转换为二进制->放置在内存中->由客户端读取并转换为字符串/一些可接受的格式。它必须在两边使用基本的swi

c++ - Visual Studio 2013 dll 导出链接错误 (LNK2019/LNK1120)

我知道之前有人问过类似的问题,但看起来在类导出方面与简单函数有所不同......我已经检查了所有这些解决方案,检查了所有建议,但看起来我仍然是遗漏了一些东西......发生了什么:我有一个用VisualStudio2013编写的主C++项目,我想添加一个包含各种实用程序的dll库。我创建了一个虚拟的,基本上没有任何功能,但它无法编译:2>TestSvc_i.c2>TestSvc.obj:errorLNK2019:unresolvedexternalsymbol"__declspec(dllimport)public:__thiscallCUtils::CUtils(void)"(__i

c++ - 模拟游戏机的内存映射,根据提供的地址访问不同的位置

我正在为旧游戏机实现模拟器,主要用于学习目的。此控制台将rom和许多其他内容映射到其地址空间内的区域。某些位置也被镜像,以便多个地址可以对应于相同的物理位置。我想效仿这一点,但我不确定这样做的好方法是什么(也不知道这个过程叫什么,因此这个有点笼统的问题)。一个有用的东西是一个简单的、无序的map。让它包含绝对地址和指向我的数据结构的相应指针。这样,我就可以轻松地将我需要的所有内容映射到系统的地址空间中。这种方法的问题在于,它显然是一种内存消耗。由于上述镜像,即使是小rom,我最终也有近千万个条目。当然,这不是正确的做法吗?非常感谢任何帮助。编辑:提供一些关于我是如何做到这一点的细节:有

c++ - 处理相似代码的优雅方式

我有一个运行良好的软件项目。现在,必须调整该项目以模拟一个新的但相关的系统。有什么策略可以使这两个代码井井有条?他们将拥有大约90%相同的代码库,但有许多功能需要稍作调整。我想到了以下几点:git-repository中的不同分支:两个项目的完美控制,但必须分别在每个分支中进行公共(public)更改。通过C++编译指示(#ifdefProject1...)对不同的程序模式进行建模:这会将更改保留在本地,但会使代码难以阅读。我对这些解决方案不太满意。有没有更好的方法? 最佳答案 我们有同样的问题,这是我们如何解决的:我们的git仓库

c++ - 生成由单独的测试类调用的 C++ 静态库的测试覆盖率

我正在使用QTCreator在C++中处理一个中型项目。项目结构基本上是这样的项目A组图书馆A1B组图书馆B1图书馆B2...等等测试LibA1_TestLibB1_TestLibB2_Test...等等库由测试项目中的可执行文件测试。我已经设法在启用gcov的情况下自行编译测试,并使用lcov生成代码覆盖率报告,但它们显示的覆盖率只是测试用例,而不是我正在测试的实际代码。我也尝试过使用gcov编译静态库,但是当我针对这些库运行测试时,它不会生成任何gcov输出文件。如何通过将我的项目库与测试链接起来来生成gcov输出文件?我想看看我的单元测试是否有任何漏洞。

c++ - 在这个简单的场景中是否可能出现死锁?

请看下面的代码:std::mutexmutex;std::condition_variablecv;std::atomicterminate;//Workerthreadroutinevoidwork(){while(!terminate){{std::unique_locklg{mutex};cv.wait(lg);//Dosomething}//Dosomething}}//Thisfunctioniscalledfromthemainthreadvoidterminate_worker(){terminate=true;cv.notify_all();worker_thread.

c++ - 是否可以使用 Wojciech Mula 算法对 __m256i 进行 popcount 并将结果存储在 8 个 32 位字而不是 4 个 64 位字中?

我最近发现AVX2没有__m256i的popcount,我发现做类似事情的唯一方法是遵循WojciechMula算法:__m256icount(__m256iv){__m256ilookup=_mm256_setr_epi8(0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4);__m256ilow_mask=_mm256_set1_epi8(0x0f);__m256ilo=_mm256_and_si256(v,low_mask);__m256ihi=_mm256_and_si256(_mm256_srli_e

c++ - 通过使用特定于平台的项目文件或使用项目生成器来构建自动化?

有些构建系统能够生成特定于平台的项目文件,例如VisualStudiosln、vcproj、vcxproj文件或XCodexcodeprojOSX下的项目。其中之一是CMake,但我发现对此的支持非常有限,存在错误,并且很难将其更新为较新的版本(如VS2010)。此外,至少CMake缺少对VisualStudio属性页的支持,这使得管理和更改项目范围的配置变得更加困难——例如为所有项目启用/禁用代码分析。上述问题的解决方法是为每个平台手动创建项目文件-在我的例子中只有两个,但即使有更多,数量也不应该那么大。将特定于平台的构建命令调用到通用构建自动化脚本中非常容易。例如,我使用waf(P

c++ - 什么是游标链表? [C++]

我的教授为我提供了一个名为CursorList.cpp的文件,它实现了“游标链表”。问题是-我什至不知道那是什么!谁能告诉我它的要点?谢谢! 最佳答案 根据this,这里是游标链表的一些背景:有些语言不支持指针改用对象数组从一个空闲列表开始在需要时从Freelist分配空间删除:改变指针,添加到Freelist所以基本上是一个不使用指针实现的链表。也许这个实现应该“更容易”理解? 关于c++-什么是游标链表?[C++],我们在StackOverflow上找到一个类似的问题: