我不明白何时应该使用std::move,何时应该让编译器优化...例如:
using SerialBuffer = vector< unsigned char >;
// let compiler optimize it
SerialBuffer read( size_t size ) const
{
SerialBuffer buffer( size );
read( begin( buffer ), end( buffer ) );
// Return Value Optimization
return buffer;
}
// explicit move
SerialBuffer read( size_t size ) const
{
SerialBuffer buffer( size );
read( begin( buffer ), end( buffer ) );
return move( buffer );
}
Run Code Online (Sandbox Code Playgroud)
我应该使用哪个?
有谁知道Win-builds和MinGW-builds之间的区别?我对Windows的C++ 11(14)编译器非常感兴趣,但遗憾的是MSVC尚未完全符合C++ 11标准.
这两个功能有什么区别?我正在使用MinGW 4.8.0.
我知道这gmtime_r是线程安全的(但如果从同一个线程多次调用,则不安全),但我不明白gmtime_s
这两个功能之间有什么显着差异吗?
struct Object {
Object(int i) : i{i}
{
}
int i;
};
Object f() { return {1}; }
Object g() { return Object{1}; }
Run Code Online (Sandbox Code Playgroud) 我正在阅读有关非虚拟接口模式的内容:Herb Sutter正在讨论为什么虚拟功能在大多数情况下必须是私有的,在某些情况下受到保护而从不公开.
但在文章的最后他写道:
不要来自具体的课程.或者,正如Scott Meyers在更有效的C++第33项中所述,[8]"使非叶类抽象化".(不可否认,它可能在实践中发生 - 在其他人编写的代码中,当然不是由您自己编写! - 在这种情况下,您可能必须拥有一个公共虚拟析构函数,以适应已经很糟糕的设计.更好地重构但是,如果可以的话,修复设计.)
但我不明白为什么这是一个糟糕的设计
我正在使用Visual Studio c ++ Compiler(2010),但该库具有不同的ANSI C和POSIX库函数的实现.
ANSI C函数和Windows CRT实现有什么区别?例如tzset()和/ _tzset()或setenv()ans有_setenv()什么区别?似乎以同样的方式做同样的事情......
我正在使用msvc(2010),我是否更喜欢Windows CRT实现?
编辑1
好吧,我希望以可移植的方式转换一个以UTC表示的结构tm time_t,但是没有可移植的方法来做到这一点.我要为不同的平台(Android,Linux,Windows,Windows CE)编写功能.
我已经看过这个使用的stackoverflow帖子setenv,getenv和tzset
EDIT2
不幸的是,经过一些测试,我发现getenv("TZ")在Windows上返回一个空指针.但为什么如此困难将UTC时间结构转换为time_t?
编辑3
从Boost中我发现了boost/chrono/io/time_point_io.hpp中的这段代码.希望这对我有所帮助.
inline int32_t is_leap(int32_t year)
{
if(year % 400 == 0)
return 1;
if(year % 100 == 0)
return 0;
if(year % 4 == 0)
return 1;
return 0;
}
inline int32_t days_from_0(int32_t year)
{
year--;
return 365 * year …Run Code Online (Sandbox Code Playgroud) 我想在并发应用程序中使用简单的日志文件.我已经下载了Boost.Logv2.0并使用编译它Boost 1.53.0.
问题是Boost.Log控制台上的输出.我正在使用BOOST_LOG_TRIVIAL(trace).
有没有一种很好的方法来重定向BOOST_LOG_TRIVIAL到文件?
如果我将一个整数转换为枚举类会发生什么,但枚举中不存在该值?例如:我想要一个函数来测试整数是否具有来自枚举类的某个值:
enum class EnumClass { A, B = 4, C = 9, D = 60 };
bool checkEnumClass( int v )
{
switch( static_cast< EnumClass >( v ) )
{
case EnumClass::A:
case EnumClass::B:
case EnumClass::C:
case EnumClass::D:
return true;
default:
return false;
}
}
checkEnumClass( 0 ) == true;
checkEnumClass( 7 ) == false; // is this true?
Run Code Online (Sandbox Code Playgroud)
这是检查整数是否可以转换为枚举的正确方法吗?
我是多线程编程的新手,我只知道最常见的Producer-Consumer-Queue.我正在使用boost c ++库,我不知道是否更好地使用boost :: lockfree :: queue或使用`mutex`和`condition_variable`的std :: queue周围的包装类.
哪里更好地使用无锁数据结构哪里更好是使用基于`mutex`和`condition_variables`的简单实现?
我不明白为什么这个简单的代码片段有死锁:
#include <atomic>
#include <thread>
#include <memory>
using namespace std;
class Test {
public:
Test() : mExit( false )
{
mThread = thread( bind( &Test::func, this ) );
}
~Test()
{
if ( mThread.joinable() )
{
mExit = true;
mThread.join();
}
}
private:
void func()
{
while ( !mExit )
{
// do something
}
}
private:
atomic< bool > mExit;
thread mThread;
};
typedef unique_ptr< Test > TestPtr;
TestPtr gTest;
int main()
{
gTest = TestPtr( new Test ); …Run Code Online (Sandbox Code Playgroud)