据我所知,添加移动语义的目的之一是通过调用特殊构造函数来复制"临时"对象来优化代码.例如,在这个答案中我们看到它可以用来优化这些string a = x + y
东西.因为x + y是一个rvalue表达式,所以我们只能复制指向字符串的指针和字符串的大小,而不是深度复制.但正如我们所知,现代编译器支持返回值优化,因此不使用移动语义,我们的代码根本不会调用复制构造函数.
为了证明这一点,我写了这段代码:
#include <iostream>
struct stuff
{
int x;
stuff(int x_):x(x_){}
stuff(const stuff & g):x(g.x)
{
std::cout<<"copy"<<std::endl;
}
};
stuff operator+(const stuff& lhs,const stuff& rhs)
{
stuff g(lhs.x+rhs.x);
return g;
}
int main()
{
stuff a(5),b(7);
stuff c = a+b;
}
Run Code Online (Sandbox Code Playgroud)
在VC++ 2010中执行它并在优化模式下执行g ++后,我得到空输出.
它是什么样的优化,如果没有它,我的代码仍然可以更快地运行?你能解释一下我的理解错误吗?
C++的一个问题是我们从密集使用模板和模板元编程的代码中获得的可怕错误消息.这些概念旨在解决这个问题,但遗憾的是它们不会出现在下一个标准中.
我想知道,这个问题是否适用于支持通用编程的所有语言?或者C++模板出了什么问题?
不幸的是,我不知道任何其他支持泛型编程的语言(Java和C#泛型太简单了,没有C++模板那么强大).
所以我问你们:D,Ada,Eiffel模板(仿制药)是否也会产生如此丑陋的错误消息?是否可以使用具有强大通用编程范例的语言,但没有丑陋的错误消息?如果是,这些语言如何解决这个问题?
编辑:为downvoters.我真的很喜欢C++和模板.我不是说模板很糟糕.实际上我是泛型编程和模板元编程的忠实粉丝.我只是问为什么我从编译器那里收到如此丑陋的错误信息.
我是对的,那个:
constexpr
都是纯函数,和constexpr
如果编译器的价格不是很高,那么任何纯函数都可以并且必须定义.如果是这样,为什么不<cmath>
定义函数constexpr
?
我正在尝试在C++ 0x中使用新的unicode字符.所以我写了示例代码:
#include <fstream>
#include <string>
int main()
{
std::u32string str = U"Hello World";
std::basic_ofstream<char32_t> fout("output.txt");
fout<<str;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是在执行这个程序后,我得到了空的output.txt文件.那么为什么它不打印Hello World?
也有一些像cout
,并cin
为这些类型已经定义,或stdin
与stdout
不支持Unicode?
编辑:我正在使用g ++和Linux.
编辑:АТТЕNTION.我发现,标准委员会驳回了来自C++ 0x的Unicode流.所以以前接受的答案不再正确.欲了解更多信息,请参阅我的答案!
我正在尝试在Windows(Qt Creator 2.0.1)下的Qt Creator中使用新的C++ 0x功能.
我在Qt,Qt Creator和QMake中阅读了配置GCC编译器开关的线程并添加QMAKE_CXXFLAGS += -std=c++0x
到.pro文件中.
之后,Qt Creator在这个简单的代码上给出了非常奇怪的错误:
#include <memory>
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
编译器错误:
':: swprintf'尚未申报
':: vswprintf'尚未宣布
我尝试使用命令从命令行编译我的代码g++ test.cpp --std=c++0x
并得到相同的错误.
那么Qt MinGW编译器有什么问题?是否可以在Qt Creator中使用C++ 0x功能?
在C++和C#中,当新的无法分配内存时,它会抛出异常.
我找不到有关Java中新行为的任何信息.那么如果新的Java失败(没有足够的内存)会发生什么?
考虑以下代码:
typedef SomeType type_t[2];
SomeType * arr1 = new type_t; //new or new[] ???
type_t * arr2 = new type_t[3]; //new or new[] ???
Run Code Online (Sandbox Code Playgroud)
根据标准,new
在第一和第二案例(new
或new[]
)中将调用哪个版本以及如何删除arr1
和arr2
(使用delete
或delete[]
)?
当我讨论这个话题时,我问自己以下问题。
是否存在翻译单元中一些未使用的代码将链接到 GCC 和 VC++ 等流行编译器的最终可执行代码(当然是在发布模式下)的情况?
例如假设我们有 2 个编译单元:
//A.hpp
//Here are declarations of some classes, functions, extern variables etc.
Run Code Online (Sandbox Code Playgroud)
以及源文件
//A.cpp
//defination of A.hpp declarations
Run Code Online (Sandbox Code Playgroud)
最后是主要的
//main.cpp
//including A.hpp library
#include "A.hpp"
//here we will use some stuff from A.hpp library, but not everything
Run Code Online (Sandbox Code Playgroud)
我的问题是。如果 main.cpp 中没有使用 A.hpp 中的所有内容怎么办?链接器是否会删除所有未使用的代码,或者在某些情况下,某些未使用的代码可以与可执行文件链接?
编辑:我对 G++ 和 VC++ 链接器感兴趣。
编辑:当然我的意思是在发布模式下。
编辑:我开始为这个问题提供赏金,以获得良好而完整的答案。我期待答案,它将解释在哪些情况下 g++ 和 VC++ 链接器链接垃圾以及它们能够从可执行文件中删除什么样的代码(不需要的函数、不需要的全局变量、不需要的类定义等...)以及为什么他们不能删除一些不需要的东西。
任何人都可以解释我,如何编写模板参数boost::function
,例如(例如boost::function<int (float,bool)>
).什么是正确的语法?
我试试这个:
template <typename T (typename Arg1,typename Arg2)>
struct func{};
Run Code Online (Sandbox Code Playgroud)
但它不起作用.