小编Gus*_*avo的帖子

访问嵌套模板类型

假设有一个A类和MyType

template<typename DataType>
class MyType {
...
}

template<typename MyType>
class A {
...
}
Run Code Online (Sandbox Code Playgroud)

当我创建A的实例时A<MyType<int>>如何在A中访问模板类型int?

c++ templates

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

在C++中实现placement new的正确方法

我已经像这样实现了新的展示位置:

inline void* operator new (std::size_t n, void* ptr) {return ptr;};
Run Code Online (Sandbox Code Playgroud)

我使用的环境没有标准库,所以我需要放置新的。使用此放置新运算符的语法应如下所示:

::new (pointer) int(); 
Run Code Online (Sandbox Code Playgroud)

我需要尺寸的原因是什么?我的 std::size_t 是无符号整数。我这样做的原因是因为没有可用的动态内存分配,我从池中获取所有指针。

c++ memory-management new-operator

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

将共享指针存储在 lambda 中以使其保持活动状态

像这样的结构体旨在存储在 lambda 中:

struct MyStruct {
  void testfunction() {
    // Do something
  }
};
Run Code Online (Sandbox Code Playgroud)

我想要的是从中构造一个共享指针并将该指针存储在 lambda 中:

auto ptr = std::make_shared<MyStruct>();
std::function<void()> caller = [ptr](){
  ptr->testFunction();
}
Run Code Online (Sandbox Code Playgroud)

调用者对象被赋予一个函数并由该函数复制。对象ptr超出范围。当我传递调用者对象时,共享指针是否仍然存在?

是否保证ptr存储在 lambda 中,并且只要调用者存在或返回,该对象就由该指针管理?如果我不调用,是否有任何编译器优化testFunction

这个问题特定于boost::asio我想使用异步处理程序传递一些对象的问题。

c++ lambda functor shared-ptr c++11

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

提升asio async_resolve对象生存期

下面的代码旨在执行以下操作:我有一个包含boost asio的解析器对象.解析器对象包含io服务和worker,因此io服务运行函数永远不会返回.只要解析器对象处于活动状态,就可以进行异步请求.当解析器对象超出范围并且队列中仍有请求时,我想完成所有并且解析器对象被销毁.

在这种情况下,根本没有调用处理程序,我不知道为什么.我认为共享指针和一些依赖循环可能存在问题.运行valgrind报告"可能会丢失内存".

任何想法如何使这个工作,所以解析器对象保持活着,直到所有工作完成?

#include <boost/asio.hpp>
#include <memory>
#include <thread>
#include <functional>
#include <string>
#include <iostream>

struct Resolver : public std::enable_shared_from_this<Resolver> {
    boost::asio::io_service                        io_service;
    std::unique_ptr<boost::asio::io_service::work> work;
    std::unique_ptr<std::thread>                   iothread;

    struct Query : public std::enable_shared_from_this<Query>{
        std::shared_ptr<Resolver>                                       service;
        boost::asio::ip::tcp::resolver                                  resolver;
        boost::asio::ip::tcp::resolver::query                           query;
        std::function<void(boost::asio::ip::tcp::resolver::iterator &)> handler;

        Query(std::shared_ptr<Resolver> res, std::function<void(boost::asio::ip::tcp::resolver::iterator &)> handler, const std::string &name) : resolver(res->io_service), query(name, ""), handler(handler) {
            service = res;

        }

        void start() {
                auto self = shared_from_this();
                resolver.async_resolve(query, [self](const boost::system::error_code& ec, boost::asio::ip::tcp::resolver::iterator iterator){
                    self->handler(iterator);
                });     
        }
    };

    Resolver() …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-asio c++11

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

销毁thread_local对象

在问题Using QSqlQuery from multiple thread中,结果是线程存储解决了问题。

我制作了一个简单的演示代码,以绝对清楚 C++11 thread_local 说明符。下面的代码创建两个线程,它们将 ThreadLocal 对象作为本地唯一对象。Storage::get 函数是线程特定的单例。标准是否保证在线程函数的连接或退出时调用 ThreadLocal 析构函数?

使用 GCC 5.4.0 编译(g++ -o main main.cpp --std=c++11 -lpthread)

#include <thread>
#include <mutex>
#include <string>
#include <chrono>
#include <iostream>
#include <atomic>

static std::mutex mtx;

struct ThreadLocal {
    std::string name;

    ~ThreadLocal() {
        mtx.lock();
        std::cout << "destroy " << name << std::endl;
        mtx.unlock();
    }
};

struct Storage {
    static ThreadLocal &get() {
        /* Thread local singleton */
        static thread_local ThreadLocal l;
        static std::atomic<int> cnt(0);
        l.name = …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading c++11

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

从多个线程使用QSqlQuery

我有许多正在运行的C ++ 11线程,它们都需要在某个时间访问数据库。在主要方面,我会初始化数据库连接并打开数据库。Qt文档说查询不是线程安全的,因此在线程内部存在QSqlQuery之前,我将使用全局互斥锁。

这行得通,但是否可以保证正常工作,或者我有时会遇到问题?

qt multithreading qtsql c++11

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

在 C++ 中获取数据类型字节数的安全方法

我正在使用 C++11 及更高版本,我在问自己是否可以安全地获取数据类型所需的字节数,例如std::uint16_t发送长度不可知的协议。更精确的调用是否安全,sizeof(std::uint16_t)我可以假设这总是 2 吗?怎么样std::int16_t

c++ c++11 uint16

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

C++ lambda 大小

这是一个无法调用任何 lambda 的 lambda 类的示例。它旨在用作函子。

template<class T>
struct lambda_class {
 T lambda;
 void operator()(){ lambda();}
};
Run Code Online (Sandbox Code Playgroud)

此类是否有任何尺寸保证。我需要的是将它存储在联合中,但如果没有特定的模板参数,我不能将它放入联合中。为此,我需要知道 lambda 的最大大小是多少。它何时是特定于编译器的并不重要。

编辑 1: 是的,我的目的是了解 std::function 是如何在内部实现的。出于这个原因,我选择 EASTL 进行理解,因为与 gnu libstdc++ 相比,它的可读性非常好。

以下链接包含功能实现的代码,该代码似乎仅使用了placement new:https : //github.com/electronicarts/EASTL/blob/master/include/EASTL/internal/function.h

我不明白的是为什么它适合存储类型?第 131 和 141 行包含函子和分配器的结构体定义。当 lambda 与多个捕获的变量绑定时会发生什么?

c++ lambda templates c++11

0
推荐指数
1
解决办法
726
查看次数

从 boost asio streambuf 读取将字节保留在缓冲区中

我在读取 boost asio 的流时遇到问题。第一次调用 async_read_until 给了我 460 个字节的传输(我用wireshark检查过)。之后,我使用一个用 streambuf 指针初始化的 istream 来使用带有 istreambuf_iterator 的 std::copy_n。这工作正常,并且 std::copy_n 的目标将请求保持到分隔符序列。

奇怪的事情发生在下一次调用 async_read_until 之后。似乎最后一个字符没有从流缓冲中读取,所以下一个处理程序调用给了我比请求的实际大小多一个字节。

将 istream 与 asio 的 streambuf 一起使用是否有任何限制?

c++ boost boost-asio

0
推荐指数
1
解决办法
1332
查看次数

在AVR的不同内存部分中进行结构打包

有以下结构:

typedef struct {
    uint8_t val1;
    uint16_t val2;
}some_config_type;

some_config_type EEMEM config = {
    .val1 = 20,
    .val2 = 2000
};
Run Code Online (Sandbox Code Playgroud)

该配置存储在eeprom内存中,我想从中加载它。我不确定avr gcc或C中是否有共同的规则,当我使用eeprom_read_block复制到另一个内存部分ram时,它保证了bot结构的布局是相同的。我想确保这在任何情况下都不会中断,并且内存布局是相同的,而不取决于部分。

c embedded struct avr alignment

0
推荐指数
1
解决办法
72
查看次数