草庐IT

c++ - std::vector::push_back() 不能在 MSVC 上为具有已删除移动构造函数的对象编译

我有一个带有已删除移动构造函数的类,当我尝试在MSVC(v.15.8.7VisualC++2017)中调用std::vector::push_back()时,我收到一条错误消息,提示我正在尝试访问已删除的移动构造函数。但是,如果我定义了移动构造函数,则代码会编译,但永远不会调用移动构造函数。两个版本都可以在gcc(v.5.4)上按预期编译和运行。这是一个简化的例子:#include#includestructA{public:A(){std::coutv{};Aa;v.push_back(a);}在VisualStudio上编译时会出现以下错误:errorC2280:'A::A(A&&

c++ - 为什么在使用 libc++ 时 sizeof( std::variant< char > ) == 8 而不是 2 (如 MSVC 的 STL 和 libstdc++)?

考虑thisexampleonCompilerexplorer.基本上,我们有这个代码片段:#include#includeenumclassEnum1:std::uint8_t{A,B};enumclassEnum2:std::uint8_t{C,D};usingVar=std::variant;usingVar2=std::variant;templatestructprint_size;voidfunc(){print_size{};print_size{};}如果我们使用GCC的libstdc++(使用clang或GCC)编译它,我们会得到预期的编译错误:error:impli

c++ - 静态常量数组在 MSVC 中动态初始化?

我们想要静态初始化一个表,但是MSVC(2015.1和更早的版本)会生成一个动态初始化器。这是演示问题的简化代码:#defineidaapi__stdcall#defineMAXSTR1024typedefinterror_t;typedefunsignedcharuchar;structpsymbol_t{shortwhat;/*-1-iserror,*//*0-anysymbol,don'tskipit*//*elselxtype_t*/shortcallNumber;/*Numberintableofmetasymbols*//*-1-nometasymbol*//*Errorc

c++ - MSVC下的奇优化问题

我看过这个博客:http://igoro.com/archive/gallery-of-processor-cache-effects/第7部分中的“怪异”引起了我的兴趣。我的第一个想法是“这只是C#很奇怪”。下面的C++代码不是我写的。volatileint*p=(volatileint*)_aligned_malloc(sizeof(int)*8,64);memset((void*)p,0,sizeof(int)*8);doubledStart=t.GetTime();for(inti=0;i我在2.4GhzCore2Quad上的时间安排如下:Option1=~8cyclesper

c++ - MSVC 如何优化静态变量的使用?

我对MicrosoftVisualC++编译器如何处理/优化静态变量感兴趣。我的代码:#includevoidno_static_initialization(){staticintvalue=3;}voidstatic_initialization(intnew_value){staticintvalue=new_value;}intmain(){no_static_initialization();static_initialization(1);static_initialization(std::rand());return0;}这是代码的程序集(经过优化编译):我的主要兴趣领

c++ - MSVC 中的 "interface"关键字是什么?

我正在查看Windows8.1SDK,在UnknownBase.h中看到类似typedefinterfaceIUnknownIUnknown;我以前从未见过这个interface关键字。请注意,这绝对是一个.hheader,由cl.exe处理。不是IDL文件,也不是midl.exe处理的。我在网上找到了这个:http://msdn.microsoft.com/en-us/library/50h7kwtb.aspx但是__interface和interface是不一样的有人能帮我介绍一下吗? 最佳答案 Microsoft有一些特定于编

c++ - 如何在 MSVC 中使用使用 MingW 编译的库?

我已经用MingW/MSYS编译了几个库...生成的静态库总是.a文件。当我尝试将库与MSVC项目链接时,VisualStudio会抛出“未解析的外部符号”......这意味着.a静态库与MSC++链接器不兼容。我认为它必须转换为与MSVC兼容的.lib文件。.a和.lib都只是.o或.obj文件的AR存档,那么有什么方法可以在MSVC项目中使用MingW编译的库?还是我必须在一个编译器/链接器中编译/链接所有内容-仅限MSVC/仅限MingW?据说MingW编译器与MSVC兼容。我阅读了一些关于这个主题的帖子,但他们大多说将文件重命名为.lib应该可以完成工作,但不幸的是它对我不起作

c++ - 为什么空基类优化 (EBO) 在 MSVC 中不起作用?

为什么空基类优化(EBO)没有在VisualC++中得到充分应用?如果我有很多基类,有什么方法可以帮助编译器进行这种优化?#includestructT1{};structT2{};structT3{};structT4{};structT5{};structT6{};structTest:T1,T2,T3,T4,T5,T6{};intmain(){std::cout 最佳答案 这是VisualC++编译器中长期存在的错误。当一个类派生自多个空基类时,只有初始的空基类会使用空基优化(EBO)进行优化。2006年在MicrosoftC

c++ - 将 bool 和 int 的引用与 MSVC 2015 进行比较时发出警告

以下代码使用MSVC(2015更新3)生成警告-使用/W4:constbool&a=true;constint&b=1;if(a==b)C4805:“==”:“constbool”类型和“constint”类型在操作中的不安全混合但没有引用它可以干净地编译。constboola=true;constintb=1;if(a==b)为什么?编辑:也只是在没有const的情况下测试过boola=true;intb=1;if(a==b)警告再次出现...编辑2:在Debug中编译...我确实不得不在constnoref情况下使C4127:conditionalexpressionisconst

c++ - 为什么 MSVC 会优化掉这个 memcpy 调用?

我有以下C代码(我将其缩短了一些其他调用和检查):#include#includeexterncharbuffer[];externvoidgetstr1(char*buff,intbuflen);externvoidgetstr2(char**s);externvoiddosomething(char*s);voidmyfn(){char*s,*s1;intlen;getstr1(buffer,128);getstr2(&s);len=*s+*buffer;memcpy(buffer+*buffer+1,s+1,(*s)*sizeof(char));*buffer=len;dosom