草庐IT

c++ - 为小型循环计数器选择什么数字类型?

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter寻求指导。关闭9年前.考虑int在内存中占用4个字节。要了解我在寻找什么,请看这个例子:for(x=0;x在这个指令中我知道x的值小于11,我看过很多代码,大多数人将x声明为int,为什么我们不应该或为什么大多数人不将x声明为short甚至像char!!我想到了原因,找到了这个解释,例如:shorts=5;s在内存中占用2个字节,我所知道的是编译器将5视为int所以要把5换

c++ - 为小型循环计数器选择什么数字类型?

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter寻求指导。关闭9年前.考虑int在内存中占用4个字节。要了解我在寻找什么,请看这个例子:for(x=0;x在这个指令中我知道x的值小于11,我看过很多代码,大多数人将x声明为int,为什么我们不应该或为什么大多数人不将x声明为short甚至像char!!我想到了原因,找到了这个解释,例如:shorts=5;s在内存中占用2个字节,我所知道的是编译器将5视为int所以要把5换

c++ - 在没有互斥锁的 C++11 中实现共享整数计数器的最简单方法 :

假设我们有以下代码来计算某事发生的次数:inti=0;voidf(){//dostuff...if(something_happens)++i;}intmain(){std::vectorthreads;for(intj=0;j就目前而言,i上有一个明确的竞争条件。使用C++11,(1)消除这种竞争条件的最简单方法是什么,以及(2)最快的方法是什么?最好不使用互斥锁。谢谢。更新:使用注释来使用原子,我得到了一个在英特尔编译器版本13下编译的工作程序:#include#include#include#include#includestd::atomici=0;voidf(intj){if

c++ - 在没有互斥锁的 C++11 中实现共享整数计数器的最简单方法 :

假设我们有以下代码来计算某事发生的次数:inti=0;voidf(){//dostuff...if(something_happens)++i;}intmain(){std::vectorthreads;for(intj=0;j就目前而言,i上有一个明确的竞争条件。使用C++11,(1)消除这种竞争条件的最简单方法是什么,以及(2)最快的方法是什么?最好不使用互斥锁。谢谢。更新:使用注释来使用原子,我得到了一个在英特尔编译器版本13下编译的工作程序:#include#include#include#include#includestd::atomici=0;voidf(intj){if

c++ - Nifty/Schwarz 计数器,符合标准?

今天早上我和一位同事讨论了静态变量初始化顺序。他提到了Nifty/Schwarzcounter我(有点)困惑。我了解它的工作原理,但我不确定这在技术上是否符合标准。假设以下3个文件(前两个是从MoreC++Idioms复制粘贴的)://Stream.hppclassStreamInitializer;classStream{friendclassStreamInitializer;public:Stream(){//Constructormustbecalledbeforeuse.}};staticclassStreamInitializer{public:StreamInitiali

c++ - Nifty/Schwarz 计数器,符合标准?

今天早上我和一位同事讨论了静态变量初始化顺序。他提到了Nifty/Schwarzcounter我(有点)困惑。我了解它的工作原理,但我不确定这在技术上是否符合标准。假设以下3个文件(前两个是从MoreC++Idioms复制粘贴的)://Stream.hppclassStreamInitializer;classStream{friendclassStreamInitializer;public:Stream(){//Constructormustbecalledbeforeuse.}};staticclassStreamInitializer{public:StreamInitiali

c++ - 原子增量和返回计数器

尝试制作一个唯一的id生成函数,并想出了这个:std::atomicid{0};intcreate_id(){id++;returnid.load();}但我认为该函数有可能两次返回相同的值,对吧?例如,线程A调用函数,增加值,然后在线程B进来并增加值时停止,最后A和B都返回相同的值。因此使用互斥锁,函数可能如下所示:std::mutexmx;intid=0;intcreate_id(){std::lock_guardlock{mx};returnid++;}我的问题:是否可以仅使用原子来创建从计数器生成唯一int值的行为?我问的原因是因为我需要生成很多id,但是读到mutex很慢。

c++ - 原子增量和返回计数器

尝试制作一个唯一的id生成函数,并想出了这个:std::atomicid{0};intcreate_id(){id++;returnid.load();}但我认为该函数有可能两次返回相同的值,对吧?例如,线程A调用函数,增加值,然后在线程B进来并增加值时停止,最后A和B都返回相同的值。因此使用互斥锁,函数可能如下所示:std::mutexmx;intid=0;intcreate_id(){std::lock_guardlock{mx};returnid++;}我的问题:是否可以仅使用原子来创建从计数器生成唯一int值的行为?我问的原因是因为我需要生成很多id,但是读到mutex很慢。

c++ - 原子 bool 无法保护非原子计数器

我遇到了一个(基本)自旋锁互斥锁的问题,它似乎无法按预期工作。4个线程正在递增一个受此互斥体保护的非原子计数器。结果与预期结果不匹配,这使得互斥锁似乎被破坏了。示例输出:result:2554230expected:10000000在我的环境中,它发生在以下条件下:flag是std::atomic,任何其他内容,例如std::atomic或std::atomic_flag(与test_and_set)工作正常。使用gcc6.3.1和-O3在X86_64上编译标记我的问题是,什么可以解释这种行为?#include#include#include#include#include#inclu

c++ - 原子 bool 无法保护非原子计数器

我遇到了一个(基本)自旋锁互斥锁的问题,它似乎无法按预期工作。4个线程正在递增一个受此互斥体保护的非原子计数器。结果与预期结果不匹配,这使得互斥锁似乎被破坏了。示例输出:result:2554230expected:10000000在我的环境中,它发生在以下条件下:flag是std::atomic,任何其他内容,例如std::atomic或std::atomic_flag(与test_and_set)工作正常。使用gcc6.3.1和-O3在X86_64上编译标记我的问题是,什么可以解释这种行为?#include#include#include#include#include#inclu