我想问一下,这样的变体安全吗?
struct A
{
unique_ptr<T> anything;
};
struct B
{
int x = 0;
int y = 0;
};
variant<A, B> myVar;
myVar = ... A object;
myVar = ... B object;
myVar = ... another A object;
Run Code Online (Sandbox Code Playgroud)
std::unique_ptr所有编译器都会调用析构函数吗?这个想法是创建一个std::arrayofvariant<A, B>以在 FIFO 中使用它。它在 Visual Studio 中似乎工作正常,但我问这个问题是因为我从cppreference.com/variant读到了这篇文章,并且我不确定我是否完全理解它:
与联合一样,如果变体保存某个对象类型 T 的值,则 T 的对象表示形式将直接在变体本身的对象表示形式中分配。不允许 Variant 分配额外的(动态)内存。
我有一个小类,它使用std :: atomic进行无锁操作。由于该课程被广泛调用,因此影响了性能,并且遇到了麻烦。
该类类似于LIFO,但是一旦调用pop()函数,它仅返回其环形缓冲区的最后写入元素(仅当自上次pop()之后存在新元素时)。
一个线程正在调用push(),另一个线程正在调用pop()。
由于这占用了我的计算机时间太多,因此我决定进一步研究std :: atomic类及其memory_order。我已经阅读了很多StackOverflow以及其他来源和书籍中的memory_order帖子,但是我无法对不同的模式有一个清晰的了解。特别是,我在获取和释放模式之间挣扎:我也看不出为什么它们与memory_order_seq_cst不同。
memory_order_relaxed:在同一线程中,原子操作是即时的,但是其他线程可能无法立即看到最新的值,它们将需要一些时间才能被更新。编译器或OS可以自由地对代码进行重新排序。
memory_order_acquire / release:由atomic :: load使用。它防止重新排序之前存在的代码行(编译器/ OS可能在此行之后对其重新排序),并使用此线程或另一个线程中的memory_order_release或memory_order_seq_cst读取存储在此原子上的最新值。memory_order_release还可以防止对该代码重新排序之后的代码。因此,在获取/发布中,两者之间的所有代码都可以被OS改组。我不确定这是在同一线程还是不同线程之间。
memory_order_seq_cst:最容易使用,因为就像我们使用变量的自然写法一样,立即刷新其他线程加载函数的值。
template<typename T>
class LockFreeEx
{
public:
void push(const T& element)
{
const int wPos = m_position.load(std::memory_order_seq_cst);
const int nextPos = getNextPos(wPos);
m_buffer[nextPos] = element;
m_position.store(nextPos, std::memory_order_seq_cst);
}
const bool pop(T& returnedElement)
{
const int wPos = m_position.exchange(-1, std::memory_order_seq_cst);
if (wPos != -1)
{
returnedElement = m_buffer[wPos]; …Run Code Online (Sandbox Code Playgroud) 我想使用数学函数在编译时填充constexpr std :: array。有可能以简单的方式吗?
我找到了以下解决方案:C ++ 11:数组的编译时间计算。但是,还有其他仅使用std的现代解决方案吗?这似乎让我感到困惑。
int main()
{
// This is the array I need to fill
constexpr std::array<double, 100000> elements;
for (int i=0; i!=100000; ++i)
{
// Each element is calculated using its position with long exponential maths.
elements[i] = complexFormula(i); // complexFormula is constexpr
}
double anyVal = elements[43621];
// ...
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用具有两个专业化的 lambda,但似乎我做错了什么。我试图在这里搜索,但除了这个之外我什么也没找到:
这对我来说没有太大帮助。请问,您能告诉我应该如何通过我的专业化调用 lambda 表达式吗?我正在使用 Visual Studio 2019 16.9.2(我还无法更新)
auto testLamb = []<typename T, int max = 2>(T data)
{
if constexpr (max == 0)
{
return data;
}
else
{
return data + max;
}
};
int f1 = testLamb<int, 4>(4); // Error C2062 !!
int f2 = testLamb(5); // OK!
Run Code Online (Sandbox Code Playgroud) c++ lambda templates template-specialization visual-studio-2019
我有宏问题,因为它们被大括号替换.
由于我需要为不同的操作系统[WINDOWS,OSX,ANDROID,iOS]编译,我正在尝试将typedef用于基本的C++类型,以便轻松替换它们并测试性能.
由于我正在进行大量的static_cast,我认为只有在需要时才能使用宏(CPU对我的软件至关重要).所以通过这种方式,static_cast只会在类型不同时执行,而是执行类似这样的奇怪操作:
const int tv = 8;
const int tvc = static_cast<int>(8);
Run Code Online (Sandbox Code Playgroud)
因此,如果启用FORCE_USE32,它将为其选择最佳版本
因此,当我执行以下操作时,使用默认编译器的Visual Studio 2017会出现错误:
#ifndef FORCE_USE32
#define FORCE_USE32 0
#endif
#if FORCE_USE32
typedef int s08;
#define Cs08(v) {v}
#else
typedef char s08;
#define Cs08(v) {static_cast<s08>(v)}
#endif
// this line give me an error because Cs08 is replaced by {static_cast<s08>(1)} instead just static_cast<s08>(1)
std::array<s08, 3> myArray{Cs08(1), 0, 0};
Run Code Online (Sandbox Code Playgroud)
我知道在我做数组之前我可以轻松地创建一个变量,就像这样
const s08 tempVar = Cs08(1);
std::array<s08, 3> myArray{tempVar, 0, 0};
Run Code Online (Sandbox Code Playgroud)
但我不明白原因,我希望尽可能保持我的代码清洁.有没有办法在数组定义中包含宏?