草庐IT

Bitwise_operation

全部标签

c++ - operator= 和 C++ 中未继承的函数?

在我刚刚进行的测试之前,我认为只有构造函数不会在C++中被继承。但显然,赋值operator=并不太...这是什么原因?是否有任何解决方法来继承赋值运算符?operator+=,operator-=,...也是这样吗?是否所有其他函数(除了构造函数/operator=)都是继承的?其实我是在做CRTP的时候遇到这个问题的:templateclassBase{inlineCrtp&operator=(constBase&rhs){/*SOMETHING*/;returnstatic_cast(*this);}};classDerived1:publicBase{};classDerive

c++ - operator= 和 C++ 中未继承的函数?

在我刚刚进行的测试之前,我认为只有构造函数不会在C++中被继承。但显然,赋值operator=并不太...这是什么原因?是否有任何解决方法来继承赋值运算符?operator+=,operator-=,...也是这样吗?是否所有其他函数(除了构造函数/operator=)都是继承的?其实我是在做CRTP的时候遇到这个问题的:templateclassBase{inlineCrtp&operator=(constBase&rhs){/*SOMETHING*/;returnstatic_cast(*this);}};classDerived1:publicBase{};classDerive

c++ - 为什么我可以使用 operator= 而不是 operator== 与 C++11 大括号初始化器?

看这个例子:structFoo{inta;intb;booloperator==(constFoo&x){returna==x.a&&b==x.b;}};intmain(){Fooa;a={1,2};if(a=={1,2})//error:expectedprimary-expressionbefore‘{’token{}}a={1,2}行很好。大括号被转换为Foo以匹配隐式operator=方法的参数类型。如果operator=是用户定义的,它仍然有效。if(a=={1,2}})行错误,如图所示。为什么表达式{1,2}不转换为Foo以匹配用户定义的operator==方法?

c++ - 为什么我可以使用 operator= 而不是 operator== 与 C++11 大括号初始化器?

看这个例子:structFoo{inta;intb;booloperator==(constFoo&x){returna==x.a&&b==x.b;}};intmain(){Fooa;a={1,2};if(a=={1,2})//error:expectedprimary-expressionbefore‘{’token{}}a={1,2}行很好。大括号被转换为Foo以匹配隐式operator=方法的参数类型。如果operator=是用户定义的,它仍然有效。if(a=={1,2}})行错误,如图所示。为什么表达式{1,2}不转换为Foo以匹配用户定义的operator==方法?

c++ - 如果键不存在,为什么 std::map operator[] 会创建一个对象?

我很确定我已经在某个地方看到过这个问题(comp.lang.c++?Google似乎也没有在那里找到它),但是在这里快速搜索似乎没有找到它,所以在这里:为什么std::mapoperator[]如果键不存在会创建一个对象?我不知道,但对我来说,如果你与大多数其他operator[](如std::vector)相比,这似乎违反直觉,如果你使用它,你必须确保索引存在。我想知道在std::map中实现这种行为的基本原理是什么。就像我说的那样,在使用无效键访问时更像是vector中的索引并崩溃(我猜是未定义的行为)不是更直观吗?我得到了很多答案,基本上都说“它很便宜,为什么不呢?”或类似的。我

c++ - 如果键不存在,为什么 std::map operator[] 会创建一个对象?

我很确定我已经在某个地方看到过这个问题(comp.lang.c++?Google似乎也没有在那里找到它),但是在这里快速搜索似乎没有找到它,所以在这里:为什么std::mapoperator[]如果键不存在会创建一个对象?我不知道,但对我来说,如果你与大多数其他operator[](如std::vector)相比,这似乎违反直觉,如果你使用它,你必须确保索引存在。我想知道在std::map中实现这种行为的基本原理是什么。就像我说的那样,在使用无效键访问时更像是vector中的索引并崩溃(我猜是未定义的行为)不是更直观吗?我得到了很多答案,基本上都说“它很便宜,为什么不呢?”或类似的。我

c++ - 对于先前分配的 vector ,为什么 push_back 比 operator[] 慢

我刚读了这篇博客http://lemire.me/blog/archives/2012/06/20/do-not-waste-time-with-stl-vectors/比较operator[]分配和push_back在内存预保留std::vector上的性能,我决定自己尝试一下。操作很简单://forvectorbigarray.reserve(N);//STARTTIMETRACKfor(intk=0;k结果如下:~/t/benchmark>icc1.cpp-O3-std=c++11~/t/benchmark>./a.out[1.cpp:52]0.789123s-->C++new[

c++ - 对于先前分配的 vector ,为什么 push_back 比 operator[] 慢

我刚读了这篇博客http://lemire.me/blog/archives/2012/06/20/do-not-waste-time-with-stl-vectors/比较operator[]分配和push_back在内存预保留std::vector上的性能,我决定自己尝试一下。操作很简单://forvectorbigarray.reserve(N);//STARTTIMETRACKfor(intk=0;k结果如下:~/t/benchmark>icc1.cpp-O3-std=c++11~/t/benchmark>./a.out[1.cpp:52]0.789123s-->C++new[

c++ - 为什么 std::vector::operator[] 比 std::vector::at() 快 5 到 10 倍?

在程序优化过程中,试图优化一个遍历vector的循环,我发现以下事实:::std::vector::at()比operator[]慢得多!在发布和调试版本(VS2008x86)中,运算符[]比at()快5到10倍。在网上阅读了一下,我意识到at()具有边界检查功能。好的,但是,最多会减慢10倍的操作速度?!有什么理由吗?我的意思是,边界检查是一个简单的数字比较,还是我遗漏了什么?问题是这种性能下降的真正原因是什么?此外,有什么方法可以让它更快?我肯定会在其他代码部分(其中我已经有自定义边界检查!)中将所有at()调用与[]交换。概念证明:#define_WIN32_WINNT0x040

c++ - 为什么 std::vector::operator[] 比 std::vector::at() 快 5 到 10 倍?

在程序优化过程中,试图优化一个遍历vector的循环,我发现以下事实:::std::vector::at()比operator[]慢得多!在发布和调试版本(VS2008x86)中,运算符[]比at()快5到10倍。在网上阅读了一下,我意识到at()具有边界检查功能。好的,但是,最多会减慢10倍的操作速度?!有什么理由吗?我的意思是,边界检查是一个简单的数字比较,还是我遗漏了什么?问题是这种性能下降的真正原因是什么?此外,有什么方法可以让它更快?我肯定会在其他代码部分(其中我已经有自定义边界检查!)中将所有at()调用与[]交换。概念证明:#define_WIN32_WINNT0x040