Tag: c ++ 11

为什么MSVC ++ 11拒绝函数的constexpr限定?

所以,玩弄constexpr,MSVC(Visual Studio 2012)给了我一个错误,而试图使用这个简单的程序(包括省略)与constexpr关键字限定我的function: constexpr int factorial(int n) { return n <= 1 ? 1 : (n * factorial(n-1)); } int main(void) { const int fact_three = factorial(3); std::cout << fact_three << std::endl; return 0; } constexpr被强调为红色并带有以下信息: 错误:此声明没有存储类或types说明符 并试图编译该程序给出了以下输出: 1> main.cpp(5):错误C2144:语法错误:'int'应该以';'开头 1> main.cpp(5):错误C4430:缺lesstypes说明符 – int假定。 注意:C ++不支持default-int 它真的令我困惑,因为它是Cppreference 用来说明constexpr的使用的一个例子。 起初,我用一个简单的函数返回一个文字,即constexpr int func(){return 5;} ,但是产生了相同的错误。 我将第一条消息解释为“它应该是一个结构或类的成员函数”,但Cppreference的例子显示它不是必要的。 那么,我显然在这里错过了什么?

你将如何在C ++ 11中实现自己的读写器locking?

我有一套数据结构,需要使用读写器锁保护。 我知道boost :: shared_lock,但我想有一个使用std :: mutex,std :: condition_variable和/或std :: atomic的自定义实现,以便我可以更好地理解它是如何工作的(并稍后调整它) 。 每个数据结构(可移动,但不可复制)将从一个称为Commons的类inheritance,该类封装了locking。 我想公共界面看起来像这样: class Commons { public: void read_lock(); bool try_read_lock(); void read_unlock(); void write_lock(); bool try_write_lock(); void write_unlock(); }; …所以它可以被一些公开的inheritance: class DataStructure : public Commons {}; 我正在写科学的代码,通常可以避免数据竞赛; 这个锁主要是防止我以后可能会犯的错误。 因此我的优先级是低的读取开销,所以我不会妨碍正确运行的程序太多。 每个线程都可能运行在自己的CPU内核上。 你能告诉我(伪代码是好的)读者/写作者锁? 我现在所拥有的应该是防止作家饥饿的变种。 到目前为止,我的主要问题是read_lock在检查read是否安全以实际递增读取器计数之间的差距,之后write_lock知道要等待。 void Commons::write_lock() { write_mutex.lock(); reading_mode.store(false); while(readers.load() > 0) {} } void […]

内存alignment:如何使用alignof / alignas?

我现在使用共享内存。 我无法理解alignof和alignas 。 cppreference不清楚: alignof返回“alignment”,但什么是“alignment”? 要为下一个要alignment的块添加的字节数? 填充大小? 堆栈溢出 /博客条目也不清楚。 有人可以清楚地alignof和alignas ?

C ++ 11智能指针语义

我已经使用了几年的指针,但是我最近才决定转换到C ++ 11的智能指针(即独特,共享和弱)。 我对它们做了一些相当的研究,这些是我绘制的结论: 独特的指针是伟大的。 他们pipe理自己的记忆,并像原始指针一样轻量级。 尽可能优先于原始指针的unique_ptr。 共享指针是复杂的。 由于引用计数,它们有很大的开销。 通过const引用传递它们,或者遗憾你的方法的错误。 他们不是邪恶的,但应该谨慎使用。 共享指针应该拥有自己的对象; 当不需要所有权时使用弱指针。 locking一个weak_ptr具有与shared_ptr拷贝构造函数相同的开销。 继续忽略auto_ptr的存在,现在已经废弃了。 所以,考虑到这些原则,我着手修改我的代码库,以利用我们新的shiny的智能指针,完全打算尽可能多地指明原始指针。 然而,我很困惑,关于如何最好地利用C ++ 11智能指针。 举个例子,假设我们正在devise一个简单的游戏。 我们决定将一个虚构的Texture数据types加载到一个TextureManager类中是最佳的。 这些纹理是复杂的,所以将它们按价值传递是不可行的。 此外,让我们假设游戏对象需要特定的纹理,取决于它们的对象types(即汽车,船等)。 在此之前,我会将纹理加载到一个向量(或者像unordered_map这样的其他容器)中,并在每个相应的游戏对象中存储指向这些纹理的指针,以便在需要渲染时可以引用它们。 我们假设纹理保证比他们的指针长。 那么我的问题就是如何在这种情况下最好地利用智能指针。 我看到几个选项: 将纹理直接存储在容器中,然后在每个游戏对象中构造一个unique_ptr。 class TextureManager { public: const Texture& texture(const std::string& key) const { return textures_.at(key); } private: std::unordered_map<std::string, Texture> textures_; }; class GameObject { public: void set_texture(const Texture& texture) […]

是否使用std :: array <T,N>导致代码膨胀?

我曾经在几个地方看到过推荐使用std::array在C ++中使用C风格的数组,声称这是一个更好,更安全的替代scheme,没有开销。 看到: 标准的容器数组没有超出它所需的元素的空间开销,[…]。 换句话说,它非常像一个没有问题的内置数组。 ( C ++ 11 FAQ ) 然而,据我所知,作为一个模板容器, 将会有一个开销,只要程序大小,因为它会生成代码为每个不同的Narrays是实例。 假设我的程序在不同的地方使用了std::array ,有N个不同的整数,这会导致代码臃肿吗? 这可以忽略不计吗? 我应该担心这一般的非types模板参数吗?

constexpr超载

相关: 函数返回constexpr不编译 我觉得constexpr在C ++ 11中的用处是有限的,因为它不能定义两个函数,否则它们会有相同的签名,但是一个是constexpr,另一个是不是constexpr。 换句话说,如果我可以有一个constexst std :: string构造函数,它只需要constexpr参数,而一个非constexpr std :: string构造函数用于非constexpr参数将是非常有帮助的。 另一个例子是理论上复杂的函数,可以通过使用状态来提高效率。 你不能用constexpr函数轻松做到这一点,所以你只剩下两个select:如果你传递了非constexpr参数,或者完全放弃了constexpr(或者写了两个单独的函数,但你可能不知道要调用哪个版本)。 因此,我的问题是: 标准兼容的C ++ 11实现是否可以允许基于constexpr参数的函数重载,还是需要更新标准呢? 如果不允许,是否故意不允许? @NicolBolas:说我有一个函数,将一个enum映射到一个std::string 。 假设我的enum从0到n – 1 ,最直接的方法是创build一个大小为n的数组,填充结果。 我可以创build一个static constexpr char const * []并在返回时构造一个std::string (每次调用该函数时支付创build一个std::string对象的代价),或者我可以创build一个static std::string const []并返回我查找的值,在第一次调用函数时支付所有std::string构造函数的代价。 看起来更好的解决scheme是在编译时在内存中创buildstd::string (类似于char const *所做的),但唯一的方法是提醒构造函数它有constexpr参数。 除了std::string构造函数以外,我认为find一个例子,如果你可以忽略constexpr的需求(从而创build一个非constexpr函数),那么你可以创build一个更多的例子高效的function。 考虑这个线程: constexpr问题,为什么这两个不同的程序在g ++中运行的时间不同? 如果我用一个constexpr参数来调用fib ,那么我完全可以比编译器优化掉函数调用来做得更好。 但是如果我用一个非constexpr参数来调用fib ,我可能希望让它调用我自己的版本来实现像memoization(这将需要状态),所以我得到的运行时间类似于我通过编译的时间一个constexpr论据。

何时使用C float比较函数?

在最新的C ++标准中,我注意到了以下macros: bool isgreater(float x, float y); bool isgreaterequal(float x, float y); bool isless(float x, float y); bool islessequal(float x, float y); bool islessgreater(float x, float y); bool isunordered(float x, float y); 这些macros来自C(7.12.14和7.12.14)。 那么,为什么有人会使用这些macros而不是操作符? 这些macros是否有什么特别之处(比如检查inf )还是与它们相应的运算符相同? C ++示例: #include <iostream> #include <cmath> int main() { float x=0.2; float y=0.5; std::cout << x << " < […]

指向不可变types的共享指针具有值语义

肖恩家长在“2013年原住民”杂志上发表了题为“ inheritance是邪恶基础类 ”的演讲。 在20分钟50秒的时间内,他发表了一个声明:一个指向不可变(const)types( std::shared_pointer<const T> )的共享指针具有值语义。 这到底是什么意思? 为什么它与共同指向可变(非const)types( std::shared_pointer<T> )的指针有什么不同?

使用std :: chrono在C ++中输出date和时间

我一直在升级一些旧的代码,并试图尽可能更新到C ++ 11。 以下代码是我用来在程序中显示时间和date的方式 #include <iostream> #include <string> #include <stdio.h> #include <time.h> const std::string return_current_time_and_date() const { time_t now = time(0); struct tm tstruct; char buf[80]; tstruct = *localtime(&now); strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct); return buf; } 我想使用std :: chrono(或类似的)类似的格式输出当前的时间和date,但我不确定如何去做。 任何帮助将不胜感激。 谢谢

如何在编译期间切换/selecttypes?

有没有一种标准的方式,我可以在编译时在c + + 11中的无符号索引select一个types? 例如,像这样的东西: using type_0 = static_switch<0,T,U>; // yields type T using type_1 = static_switch<1,T,U>; // yields type U 如果有一个可变模板版本,这将是非常有用的。