问题标签 [visual-c++-2019]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 读写后从流中返回相同的数据 с++
我想实现将文件作为数组处理的想法。这是一段代码。在下一次写入之后,从流中返回相同的数据。如果我在写入数据后进行刷新,一切都会好起来的。告诉我为什么你需要一个闪光灯,你能没有它吗?
c++ - 正确使用 RDRAND(片上生成器)作为 std::random_device 与 Visual C++ 的随机库
我希望能够在可用时使用硬件随机数生成器,并且无论英特尔或 AMD 运行代码如何,都可以使用 C++ 随机库:
根据这篇文章,entropy()
应该在没有 RDRAND 的 cpu 上返回 0,例如 i7-2670qm ivy 桥(我在其上测试过 - RDRAND 第一次出现在其继任者 Sandy Bridge 中),但在 Visual Studio 中始终为 32如此处所述。有人建议缺少随机设备可能会导致operator()
抛出异常,但这也不会发生。
例如,可以使用内在函数int _rdrand32_step (unsigned int* val)
,但只能从均匀分布中提取,我需要能够利用 C++ 随机库中可用的分布。
此外,代码应该使用 AMD cpu 上的硬件生成器。
random
在 Visual Studio(2017、2019)中将硬件随机数生成器(RDRAND)与 C++ 库一起使用的正确方法是什么?
c++ - VC2019:编译器错误、std::pair 错误或模糊功能
下面的代码使应用程序崩溃或打印乱码。如果基类的初始化被替换为str_int{ string{V}, 0}
then 它工作正常。似乎可以与某些在线编译器一起正常工作。
c++ - MSVC++ 2019 中的内存分配
我有一个关于内存分配的问题,尤其是在使用 MSVC2019 时。
我有一个编译为 x64 的 C++ 程序。通过调试我看到,分配变量会产生非常高的指针地址,指向前 4GB 地址空间(32 位)上的位置。如果我在任务管理器中检查程序,我发现它只使用了大约 30-50MB 的内存。
当实际上4GB以下的整个地址空间未被使用时,变量没有分配到虚拟内存空间的下部是什么原因?
我希望分配从低地址开始,直到使用的第一个 4GB 空间,不需要为此分配空间。
为什么这对我来说很有趣:我有一个包含超过 15 年历史的 C++ 代码的大型软件,它并非到处都准备好成为 64 位,在许多地方它将指针转换为 32 位类型,因此指针被损坏。最初的作者很可能假设指针是 32 位的。当编译为 64 位时,实际上应该也是如此,因此程序没有使用太多内存,内存使用量不会增长超过 4GB。并且似乎在使用 2010 年的编译器进行编译时,并没有出现这个问题,可能是那个时候内存分配导致了第一个 4GB 块中的地址,即使是为 x64 编译的也是如此。
我的问题是:这种分配策略会以某种方式影响 MSVC++ 2019 吗?例如。指示他的编译器/链接器/内存管理器优先分配前 32 位空间,直到不再需要?或者,为内存管理器提供的虚拟地址空间设置大小限制,例如。通过设置为 2GB,我可以实现永远不会有任何指针指向超过 4GB 的已分配块。这样,假设指针为 32 位,旧代码将在强制转换操作中存活下来。
我已经尝试在链接器选项中设置 NO 以获得高内存感知,并检查了堆参数,但它们都没有帮助。
谢谢!
c++ - 使用来自 boost::array 与 std::array 的 std::string::assign 不兼容
一些遗留代码如下所示:
我正在更新代码以使用我们更新到 C++17 的std
等效boost
项,我认为array
这是一个直接替换,但是当我尝试这个时,我得到一个编译错误:
错误 C2664: 'std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> ::assign(std::initializer_list<_Elem>)':无法使用 [ _Elem=wchar_t ] 和 [ _Ty= 将参数 1 从 'std::_Array_iterator<_Ty,2001>' 转换为 'std::initializer_list<_Elem>' wchar_t ] 和 [ _Elem=wchar_t ]
我们在代码库的很多地方都使用了这种模式,是否有一个简单的修复?两者之间的具体区别是什么boost::array
,std::array
导致这种情况的原因是什么,这是否意味着它不能被视为直接替代品?
(这段代码不是我写的。我不知道为什么我们不只是使用wchar_t[]
;也许作者只是喜欢 boost 中的“新”功能。)
c++ - 缺少 .qmake.stash 文件
谁创建 .qmake.stash 文件?它是什么时候创建的?
多年来,我一直在 Visual Studio 中使用 Qt 创建 Windows 应用程序,但从未关心过这个文件。但是现在我已经使用 WSL 1 在 Visual Studio 中设置了交叉编译,以便在 arm64 上构建我的 Linux 应用程序。我能够在我的开发计算机上构建我的 VS 解决方案中的所有项目。现在我正在尝试在另一台 PC 上设置这个交叉编译系统。该解决方案的第一个项目可以毫无问题地构建,但第二个项目失败了
经过数小时比较项目文件和配置的调查后,我找到了原因:qmake 在应该创建 Makefile 时没有找到 .qmake.stash 文件。
工作项目在中间输出路径 $(IntDir) /obj//<vs_configuration> 中有一个 .qmake.stash 文件,例如 myproject/obj/x64/RelArm64。失败的项目在其 $(IntDir) 中没有此文件。如果我手动将此文件从工作项目复制到另一个项目,它也可以工作。
谁应该在执行 qmake 之前将此文件放置到 $(IntDir) 中?
我在工作项目中的 qmake.stash 文件很旧。所以它似乎不是在每个构建过程中生成的。
c++ - 使用 std::chrono::from_stream() 解析时间格式“DD/MM/YYYY at hh:mm:ss”和其他格式
我目前正在尝试解析日志文件中列出的有关实验开始时间的一些信息。在读取文件重要信息后,例如列标题、开始时间、测量之间的时间,使用<regex>
.
我正在尝试使用该std::chrono::from_stream(...)
函数将格式为“DD/MM/YYYY at hh:mm:ss”的字符串解析为字符串std::chrono::time_point
示例:
2021 年 8 月 3 日 09:37:25
目前我正在尝试使用以下函数来尝试此操作,该函数尝试从提供的字符串构造一个持续时间来解析和一个字符串来解析它,然后将其转换为 time_point 以便我可以控制使用的时钟:
可以在此处找到 from_stream 的 MS 文档。在 from_stream 文档之后提供有关不同格式字符的详细信息。
c++ - 奇怪的 C2143 错误,两个连续的 if constexpr 在同一个函数中
我正在用 c++17 编译以下代码:
使用 MSVC 2019(版本 16.8.30804.86,它应该是最后一个可用的版本)构建时,我在该行遇到了一个奇怪的 C2143 错误
完整的 C2143 错误是:
我注意到:
- 如果我评论
if constexpr
函数的第二个块foo
,错误就会消失; - 如果我没有定义 alias
using MyK = K<Args...>;
,错误就会消失。
该代码在 gcc 和 clang 上都可以正常工作。这只是一个 MSVC 错误,还是我在代码中的某处破坏了 c++17 标准?