小编woh*_*tad的帖子

我可以用 AND 替换 if 语句吗?

我的教授曾经说过,if 语句相当慢,应该尽可能避免。我正在用 OpenGL 制作一个游戏,我需要很多它们。在我的测试中,通过短路将 if 语句替换为 AND 是有效的,但是它更快吗?

bool doSomething();

int main()
{

  int randomNumber = std::rand() % 10;

  randomNumber == 5 && doSomething();

  return 0;
}

bool doSomething()
{
    std::cout << "function executed" << std::endl;

    return true;
}
Run Code Online (Sandbox Code Playgroud)

我的目的是在渲染器的绘制函数中使用它。我的模型应该有标志,如果标志为真,则应该执行某个函数。

c++ if-statement logical-operators

3
推荐指数
1
解决办法
809
查看次数

std::visit 不接受作为派生类对象的可调用对象

我正在尝试使用std::visit来检查std::variant.
首先,我声明变体和变体的基(可调用)访问者类:

#include <iostream>
#include <string>
#include <variant>


using Amalgamation = std::variant<int, bool, std::string>;

class BaseVisitor {
public:
    virtual void operator()(int) {}
    virtual void operator()(bool) {}
    virtual void operator()(const std::string&) {}
};
Run Code Online (Sandbox Code Playgroud)

其次,我定义了另一个从上面的基类派生的访问者类:

class CheckBooleanVisitor
    : public BaseVisitor {
public:
    CheckBooleanVisitor()
        : m_isBoolean(false) {
    }

    virtual void operator()(bool) override { // WHERE THE OVERRIDING TAKES PLACE
        m_isBoolean = true;
    }

    bool isBoolean() const {
        return m_isBoolean;
    }
};
Run Code Online (Sandbox Code Playgroud)

我使用这个“派生”访问者类来访问如下变体:

int main() {
    Amalgamation a(0);
    Amalgamation b(false); …
Run Code Online (Sandbox Code Playgroud)

c++ std variant c++17

3
推荐指数
1
解决办法
224
查看次数

cpp 文件中的本地函数模板:我应该将其设为静态吗?

// CPP file

template<typename T>
void foo()
{
}

// Use the template only in this CPP as foo<int>, foo<char>, etc.
Run Code Online (Sandbox Code Playgroud)

假设我有 CPP 文件,并且有一个foo仅在该 CPP 文件内部使用的模板函数。我是否理解正确,如果我不将模板放入匿名名称空间或不创建它static,则在此 CPP 文件中使用/创建的其实例化foo<int>{}(例如,foo<char>{}等)将具有外部链接,即将在外部看到。那么,我最好将模板静态化(如下所示)还是将其放在匿名名称空间中,这是真的吗?

// CPP file

template<typename T>
static void foo()
{
}
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

3
推荐指数
1
解决办法
130
查看次数

用于保存 std::byte 的 C++ 类

有没有保存到文件std::bytes 中的 C++ 类?我已经使用了std::ofstream,但是需要强制转换才能执行它:

std::byte bt{ 1 };
std::ofstream ofs{};
ofs.write(reinterpret_cast<const char*>(bt), 1);
Run Code Online (Sandbox Code Playgroud)

你看:reinterpret_cast<const char*>?是否有其他std::byte无需任何强制转换即可保存的 C++ 类?

c++ c++17

3
推荐指数
1
解决办法
166
查看次数

为什么lock_guard是一个模板?

我刚刚了解到std::lock_guard,我想知道为什么它是一个模板。
到目前为止我只见过尖括号内的std::lock_guard<std::mutex>with 。std::mutex

c++ concurrency mutex

2
推荐指数
1
解决办法
469
查看次数

如何清除使用用户定义比较的“priority_queue”?

如何清除priority_queue使用用户定义的比较?

\n

std::priority_queue文档priority_queue中,我减少了我需要的情况的使用(=带有用户定义比较的队列)

\n
>> cat test.cpp \n#include <functional>\n#include <queue>\n#include <vector>\n#include <iostream>\n#include <utility>\n\nauto queue_cmp = [](std::pair<int, double> const& lhs,\n                    std::pair<int, double> const& rhs) {\n    return lhs.second > rhs.second; // Custom order.\n};\ntypedef std::priority_queue<std::pair<int, double>,\n                            std::vector<std::pair<int, double>>,\n                            decltype(queue_cmp)> custom_queue;\n\ntemplate<typename T>\nvoid print_queue(T q) { // NB: pass by value so the print uses a copy\n    int s = 0;\n    while(!q.empty()) {\n        std::pair<int, double> elem = q.top();\n        std::cout << s << ": " << elem.first << ", " …
Run Code Online (Sandbox Code Playgroud)

c++ std priority-queue

2
推荐指数
1
解决办法
189
查看次数

c++11atomic&lt;int&gt;++ 比 std::mutex protected int++ 慢得多,为什么?

std::atomic<int>为了比较++ 和std::mutexprotected ++的性能差异int,我有这个测试程序:

#include <iostream>
#include <atomic>
#include <mutex>
#include <thread>
#include <chrono>
#include <limits>
using namespace std;
#ifndef INT_MAX
const int INT_MAX = numeric_limits<std::int32_t>::max();
const int INT_MIN = numeric_limits<std::int32_t>::min();
#endif
using std::chrono::steady_clock;
const size_t LOOP_COUNT = 12500000;
const size_t THREAD_COUNT = 8;
int intArray[2] = { 0, INT_MAX };
atomic<int> atomicArray[2];
void atomic_tf() {//3.19s
    for (size_t i = 0; i < LOOP_COUNT; ++i) {
        atomicArray[0]++;
        atomicArray[1]--;
    }
}
mutex m;
void mutex_tf() {//0.25s
    m.lock(); …
Run Code Online (Sandbox Code Playgroud)

c++ performance mutex atomic c++11

2
推荐指数
1
解决办法
238
查看次数

[[不太可能]]可以用循环吗?

我在频繁使用的 if 上使用[[likely]]/ 。[[unlikely]]我最近有一个循环,其中条件很少满足,即循环很少进入或重复。
是否可以[[unlikely]]循环播放?在 en.cppreference.com 上我没有找到任何相关内容。

c++ c++20

2
推荐指数
1
解决办法
114
查看次数

当派生对象被销毁时,调用子析构函数和父析构函数是否存在任何问题?

如果我有以下两个课程:

#include <cstdlib>

class Parent
{
    protected:
        int* mem = (int*) std::malloc(5); // pointer to dynamically-stored object
    public:
        Parent() {};
        virtual ~Parent()
        {
            delete(mem);
        }
};

class Child: public Parent
{
    public:
        Child() {};
        ~Child()
        {
            delete(mem);
        }
};

int main(void)
{
    Child* c = new Child();
    delete(c);
}
Run Code Online (Sandbox Code Playgroud)

不应该打电话delete调用该类的实例Child导致分段错误,因为父级的析构函数也会在子级析构函数之后自动调用?如果是这样,解决方案是否是类Child只处理释放类“拥有”的动态分配的内存(即不在 的析构函数中Child删除并让其处理它)?memChildParent

我运行了我的 main 函数,并预计会发生分段错误,因为mem被释放了两次 - 一次在 的Child析构函数中,另一次在Parent析构函数中。没有发生错误,这让我感到惊讶。谁能解释一下为什么吗?

c++ polymorphism inheritance memory-management segmentation-fault

2
推荐指数
1
解决办法
89
查看次数

如何为 std::shared_ptr 和 std::unique_ptr 编写模板化工厂函数

我经常编写具有类似于以下签名的工厂:

std::unique_ptr<AbstractType> createUnique(IDType id);
std::shared_ptr<AbstractType> createShared(IDType id);
Run Code Online (Sandbox Code Playgroud)

前者会做类似的事情:

switch (id)
{
case kID1:
    return std::make_unique<Type1>();
}
Run Code Online (Sandbox Code Playgroud)

而后者

switch (id)
{
case kID1:
    return std::make_shared<Type1>();
}
Run Code Online (Sandbox Code Playgroud)

那么,这两个函数之间的唯一区别是使用的“make”函数(make_sharedmake_unique)和返回类型(shared_ptrunique_ptr)。这会导致代码重复。

我想知道如何编写一个create接受指针类型和“make”函数类型并使用它们的模板化函数。就像是:

template <typename PTR, typename MAKE>
PTR create(IDType id)
{
    switch (id)
    {
    case kID1:
        return MAKE<Type1>();
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道以上不是有效的代码。

另外,我知道 astd::shared_ptr可以从 an 创建,std::unique_ptr反之亦然,但我这个工厂将用于不同的应用程序,其中一个可能使用 a shared_ptr,另一个可能使用unique_ptr. 这样,代码就可以重复使用,而且对于特定的用例也很有效。

c++ templates smart-pointers c++17

2
推荐指数
1
解决办法
108
查看次数