小编LRa*_*aiz的帖子

如何将不可复制和不可移动的对象分配到std :: map中?

我有一个对象,我想限制只在一个内部分配std::map.这是简化的代码:

#include <map>

class Value
{
public:
    Value(int value) { _value = value;}
    Value(const Value&) = delete;
    Value& operator=(const Value&) = delete;
    Value(Value&&) = default;     // ***
    void* operator new(size_t) = delete;    // not on free store
private:
    int _value;
};

class Container
{    
public:
    Container();
    Value* addToMap(int key) {
        auto ret = _map.emplace(key, key);
        return &(ret.first->second);
    }
private:
    std::map<int, Value> _map;
};
Run Code Online (Sandbox Code Playgroud)

为了使用CLang在Mac上进行编译,我必须添加一个标记为星号的行,请求默认的移动构造函数.但是,在Windows Visual Studio中编译时,此行会导致C2610错误.看起来VS2013 C++ 11不合规包括无法生成默认移动构造函数.我是否有不同的方法在标准映射中分配一个可以跨平台编译的对象,还是我必须实现自己的移动构造函数?

c++ stdmap move-semantics c++11

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

如何将int转换为const GLvoid*?

在我的跨平台OpenGL应用程序中,我想使用顶点缓冲区对象进行绘制.但是我遇到了调用glDrawRangeElements的问题.

glDrawRangeElements(GL_TRIANGLES, start, start + count, count, 
            GL_UNSIGNED_INT,  static_cast<GLvoid *>  (start * sizeof(unsigned int)));
Run Code Online (Sandbox Code Playgroud)

编译器(Mac OS X上的CLang)不喜欢最后一个参数"错误:无法从类型'unsigned long'转换为指针类型'GLvoid*'(又名'void*')".OpenGL API将最后一个参数的类型定义为const GLvoid*,并且当此api与顶点数组一起使用时需要一个指针.但是我知道当使用顶点缓冲区对象而不是指针时,应该将一个表示偏移量的整数值传递给缓冲区数据.这就是我想要做的事情,因此我必须施展.如何协调api要求与编译器进行严格的检查?

opengl vertex-buffer c++11

5
推荐指数
3
解决办法
3023
查看次数

有什么方法可以使用 boost::obect_pool 进行更快的免费操作

我一直在使用 boost object_pool 一段时间,并且对结果总体上感到满意。以前我主要是分配单个对象,但很少单独释放它们,只是一次释放整个池。最近,当我遇到需要从池中释放许多对象时,我发现它非常慢。

显然 pool 正在搜索已发布的块列表以链接新发布的对象。该文档讨论了有序和无序池,并提到了 pool_allocator 和 fast_pool_allocator。无序池(使用 fast_memory_allocator)在释放内存块方面可能会快得多。但是,我看不到如何使用它。

我是否正确理解我只能在 pool_allocator 和 fast_pool_allocator 之间选择与 boost::singleton_pool 而不是 boost::object_pool ?

下面是一个说明问题的小测试程序。它是用 VS2013 和 boost 1_57_0 构建的。测试在对象池中分配 n 个对象,然后随机释放 10%。它有一些粗略的计时工具,表明对于 n == 100,000,分配需要 0.004 秒,而释放需要 0.4 秒。同时,对于 n == 1,000,000,在我的机器上分配需要 0.022 秒,释放需要 42 秒。

#include <boost/pool/object_pool.hpp>
#include "time.h"
#include <vector>
#include <random>

struct foo {
    int data[10];
};

struct test {
    test(unsigned n) : size{ n } {}
    void run();
    float elapsedSec(clock_t& watch);
    unsigned size;
    boost::object_pool<foo> _pool;
    float mallocSec;
    float freeSec; …
Run Code Online (Sandbox Code Playgroud)

c++ boost memory-management

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