小编gal*_*tte的帖子

gcc 警告未使用的 RAII 变量

我有一个名为 的类MutexLock,它听起来像:它在构造时锁定互斥锁,并在销毁时释放它:

    class OpenEXRMutexLock
    {
#ifndef HAVE_PTHREADS
    public:
        OpenEXRMutexLock() : lock(openEXRmutex) { }
    private:
        std::unique_lock<std::mutex> lock;
#endif
    };
Run Code Online (Sandbox Code Playgroud)

当定义了 HAVE_PTHREADS 时,gcc 4.9.1 每次我都会抱怨未使用的变量:

OpenEXRMutexLock lock;
Run Code Online (Sandbox Code Playgroud)

当然,这个类永远不会在构造和自动销毁之外使用。

目前,我做了一些丑陋的事情:我补充说

void OpenEXRMutexLock::dummyFuncAvoidingWarnings() const {}
Run Code Online (Sandbox Code Playgroud)

并随处调用它:

OpenEXRMutexLock lock;
lock.dummyFuncAvoidingWarnings(); //Eeerk
Run Code Online (Sandbox Code Playgroud)

有没有办法在不禁用整个项目中未使用的变量警告的情况下避免这种情况

c++ gcc warnings raii unused-variables

4
推荐指数
1
解决办法
1763
查看次数

错误的vsnprintf输出

我有以下功能:

void raiseError(const char *msg, ...)
{
    va_list ap;
    va_start(ap, msg); // use variable arg list

    int size = vsnprintf(nullptr, 0, msg, ap);
    std::vector<char> s(size+1, 0);
    vsnprintf(s.data(), size, msg, ap);
    va_end(ap);
    errorString = std::string(s.data()));
}
Run Code Online (Sandbox Code Playgroud)

我打电话的时候

raiseError("File not found in <%s> : <%s>", "a", "b" );
Run Code Online (Sandbox Code Playgroud)

第一个vsnprintf调用(计算最终字符串大小)返回正确的值27.但最后一个字符串是:

"<**A*>中找不到文件:"

程序启动时'*'字符是随机的.

此外,该程序在MinGW中工作,问题只出现在linux gcc上.

我的代码有什么问题?

c++ printf variadic-functions

4
推荐指数
1
解决办法
376
查看次数

C/C++:是否使用比较结果作为 int 真的无分支?

我在很多 SO 答案中都看到过这种代码:

template <typename T> 
inline T imax (T a, T b)
{
    return (a > b) * a + (a <= b) * b;
}
Run Code Online (Sandbox Code Playgroud)

哪里有作者说这个无分支。

但这在当前架构上真的是无分支的吗?(x86, ARM...) 是否有真正的标准保证这是无分支的?

c++ comparison branch-prediction

4
推荐指数
1
解决办法
1010
查看次数

检查容器模板类中的迭代器类型

我正在编写一个容器类,并希望提供一个构造函数,将迭代器作为参数,但前提是底层迭代类型与容器类型匹配.

所以我写道:

template<typename T>
class Buffer
{
public:
    template <typename InputIter>
    typename std::enable_if<std::is_same<typename std::iterator_traits<InputIter>::value_type, typename T>>::type
    Buffer(InputIter first, InputIter last)
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

但我有编译错误说模板参数1和2无效

怎么了?

代码与编译器:https://onlinegdb.com/SyIqN_mBG

c++ templates template-meta-programming

4
推荐指数
2
解决办法
166
查看次数

C++序列化 - 使用从char*到结构的reinterpret_cast

我正在交换一个struct update_packet与其他服务器(相同或类似系统)调用的结构,通过UDPsocket使用sendto(..)和运行相同的程序recvfrom().

update_packet 需要采用通用消息格式,这意味着其字段具有预定的固定大小,结构的大小是字段的总和.

struct node {
    uint32_t IP;
    uint16_t port;
    int16_t nil;
    uint16_t server_id;
    uint16_t cost;
};

struct update_packet {
    uint16_t num_update_fields;
    uint16_t port;
    uint32_t IP;

    struct node * nodes;

    update_packet() :
        num_update_fields(num_nodes), IP(myIP), port(myport)
        {//fill in nodes array};
};
Run Code Online (Sandbox Code Playgroud)

(update_packet包含一个指针数组struct node)

我以前用UDP reinterpret_cast发送一个实例update packet,然后编译并发送到正确的目的地.

int update_packet_size = sizeof(up);
sendto(s, reinterpret_cast<const char*>(&up), update_packet_size, 0,
       (struct sockaddr *)&dest_addr, sizeof(dest_addr));
Run Code Online (Sandbox Code Playgroud)

但是,当我收到它并尝试解码它

struct update_packet update_msg =
    reinterpret_cast<struct …
Run Code Online (Sandbox Code Playgroud)

c++ sockets serialization deserialization

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

在MinGW 64(posix线程版本)中std :: mutex和QMutex的性能

我试图QMutex在我的应用程序(蒙特卡罗模拟)中替换std::mutex,并且令人惊讶的是,计算速度除以3.互斥锁定/解锁性能成本从可忽略不计到线程时间的约66%.

我深入研究了实现源代码.我最初认为两者都是Win32线程的包装器(有一个额外的pthread层std::thread),但实际上Qt没有使用任何内核函数用于互斥锁,并且有自己的基于原子变量的内部实现.这个似乎要快得多.

  • 是否真的可以完全实现只有原子变量的互斥锁?它有局限性吗?
  • 为什么这不用于STL?
  • 在我的案例中,完全避免互斥量的准则是什么?我在浮点缓冲区上累积(加法运算)值,在多个线程之间共享

谢谢

qt mutex stl atomic c++11

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

在if语句中声明类变量

c ++接受:

if(int a=1)
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

出于学习目的,我编写了一个简单的锁机制类:

class SimpleLock
{
public:
    class Token
    {
    public:
        friend class SimpleLock;
        Token(SimpleLock & lock) : lock(lock), locked(!lock.locked.exchange(true)) { }
        ~Token() { if(locked) lock.locked.store(false); }
        operator bool() const { return locked; }

    private:
        SimpleLock & lock;
        const bool locked;
    };

    SimpleLock() : locked(false) { }

private:
    std::atomic_bool locked;
};
Run Code Online (Sandbox Code Playgroud)

允许我这样做:

SimpleLock::Token t(lock);

if(t) //Token has an operator bool() overload
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

以下为什么不编译?

if(SimpleLock::Token t(lock))
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

在't'之前预期的初级表达

在线代码链接:http: …

c++ variables if-statement class

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

当没有更多工作要做时,防止 boost::asio::io_context 返回

boost::asio::io_context::run()当没有待处理的工作时确实返回。我想避免这种行为,以便run()无限期地等待新作品,并有可能从另一个线程中停止它。

我想这可以通过在 中启动一个无限长的计时器io_context,并cancel()在需要时调用该计时器来完成run()返回来完成。

这是一种正确的方法吗,有没有一种干净的方法来做到这一点?

c++ boost-asio

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

从基类实例获取指向(纯)虚拟函数的指针

我有下面的c ++ 11代码,可以正常工作,而我希望它会崩溃甚至无法编译。检索指向纯虚拟成员函数的指针应返回null或无效的指针,或者应被编译器阻止。我想了解它为什么起作用。

我知道还有其他(更好)的方式对此进行编码,这是理解语法的纯理论性问题。

#include <iostream>
#include <functional>

class Abstract
{
public:
    void foo()
    {
        auto func = std::bind(&Abstract::virtualFoo, this);
        func();
    }

protected:
    virtual void virtualFoo() = 0;
};


class Derived1 : public Abstract
{
private:
    void virtualFoo() override
    {
        std::cout << "I am Derived1\n";
    }
};

class Derived2 : public Abstract
{
private:
    void virtualFoo() override
    {
        std::cout << "I am Derived2\n";
    }
};


int main(int argc, char *argv[])
{
    Abstract * a1 = new Derived1;
    Abstract * a2 …
Run Code Online (Sandbox Code Playgroud)

c++ virtual pointers function derived

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

将 lambda 传递给以 std::function 作为参数的模板函数

我有一个带有std::function参数的模板函数,模板参数定义函数签名:

template<typename... Args>
void addController(const char * name, const std::function<bool(Args...)> & func);
Run Code Online (Sandbox Code Playgroud)

它可以传递一个std::function变量:

std::function<bool()> foo_func = [this]()->bool {return this->isFoo(); };
addController<>("foo", foo_func);  //Works
Run Code Online (Sandbox Code Playgroud)

但如果我直接传递 lambda,则无法推导出类型:

//Fails to compile
addController<>("foo", [this]()->bool {return this->isFoo(); });
Run Code Online (Sandbox Code Playgroud)

使用非模板函数可以:

void addControllerNoArg(const char * name, std::function<bool()> func);
addControllerNoArg("foo", [this]() {return this->isFoo(); });  //Works
Run Code Online (Sandbox Code Playgroud)

我需要 <typename... Args> 模板来将变体向量参数表展开到函数调用中。这实际上在实现中确实有效,唯一的问题是我无法直接将 lambda 传递给 addController 。

最小示例: https: //onlinegdb.com/MS1cEreKhk

c++ lambda templates function

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