小编eve*_*ode的帖子

C预处理器是否删除了"&*"的实例?

我正在玩,gcc并尝试了以下一些代码:

int A = 42;
int *B = &A;
int *C = &*B;
Run Code Online (Sandbox Code Playgroud)

并且C == &A,正如所料.但是当我尝试:

int *B = NULL;
int *C = &*B;
Run Code Online (Sandbox Code Playgroud)

原来C == NULL,没有段错误.因此,在获取其地址之前&*B实际上并未解除引用B.

我的猜测是预处理器剥离出来的情况下,&**&之前,他们甚至得到了编译器,因为他们否定对方,但我无法找到任何文件,以验证这是否是标准ç或编译器特定的.

被预处理器剥离出来&*,并*&和我可以期待从任何给定的编译器这种行为?

c standards addressof indirection c-preprocessor

25
推荐指数
2
解决办法
1208
查看次数

为什么我的线程有时会"口吃"?

我正在尝试编写一些多线程代码来从DAQ设备读取并同时渲染捕获的信号:

std::atomic <bool> rendering (false);
auto render = [&rendering, &display, &signal] (void)
    {
        while (not rendering)
            {std::this_thread::yield ();};
        do {display.draw (signal);}
            while (display.rendering ()); // returns false when user quits
        rendering = false;
    };
auto capture = [&rendering, &daq] (void)
    {
        for (int i = daq.read_frequency (); i --> 0;)
            daq.record (); // fill the buffer before displaying the signal
        rendering = true;
        do {daq.record ();} 
            while (rendering);
        daq.stop ();
    };
std::thread rendering_thread (render);
std::thread capturing_thread (capture);

rendering_thread.join ();
capturing_thread.join …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading openmp c++11

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

我可以为运营商明确指定模板参数吗?

我有Foo课:

class Foo {
    template <typename T>
    T* operator () (void) {
        return (T*) something;
    }
}
Run Code Online (Sandbox Code Playgroud)

T无法推断,但我想要的是能够说出类似的东西

Foo foo;    
type_t bar = foo <type_t> ();
Run Code Online (Sandbox Code Playgroud)

但这是一个语法错误.

有没有办法做到这一点?(或者在不提供类型实例的情况下传入类型的更好方法?)

c++

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

OpenGL-OpenCL互操作传输时间+来自位图的纹理

两部分问题:

我正在研究一个学校项目,使用生命游戏作为试验gpgpu的工具.我正在使用OpenCL和OpenGL进行实时可视化,目标是让这个东西尽可能大而快.在分析时,我发现帧时间由CL获取和释放GL缓冲区控制,并且时间成本与缓冲区的实际大小成正比.

1)这是正常的吗?为什么会这样?据我所知,缓冲区永远不会离开设备内存,而CL Acquire/Release就像互斥锁一样.OpenCL是单独锁定/解锁每个字节还是什么?

为了解决这个问题,我已经从24位RGBA颜色模式(我理解的OpenGL首选颜色模式?)缩小到8位RGB颜色.这导致了主要的加速,但在调整我的内核之后,传输时间再次占据主导地位.

在没有关于如何完全消除传输时间的任何想法(没有将我的内核从OpenCL移植到GLSL,这将超出项目的原始范围),我现在认为我最好的选择是写入位图(与我目前使用的8位像素图相反,然后使用带有颜色索引的位图来构造四边形.

2)我可以使用位图直接纹理四边形吗?我已经考虑过使用glBitmap绘制一个辅助缓冲区,然后使用这个缓冲区来构建我的四边形,但我更愿意使用一个更直接的路径(如果有的话).

opengl opencl

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

为什么push_back在包含unique_ptr的结构上成功,除非该结构具有自定义析构函数?

当且仅当我删除Foo的自定义析构函数时,以下代码才会编译.

struct Foo {
    std::unique_ptr <int> bar;
    ~Foo (void) {} // This Line
};
std::vector <Foo> foos;
foos.push_back (Foo ());
Run Code Online (Sandbox Code Playgroud)

以下是我认为我对这种情况的理解:

它失败,因为unique_ptrs无法复制,并std::vector::push_back (thing)调用thing's复制构造函数.如果我编写Foo一个明确移动的自定义复制构造函数bar,那么一切都会好的.

但是,禁用This Line将导致代码编译.

我想,这应该无法编译,即使没有This Line,因为我仍然在尝试push_back一个unique_ptr.

为什么没有自定义析构函数就能成功,为什么添加自定义析构函数会导致它失败?

编辑:gcc -std=gnu++11在Debian Linux 64位上使用

c++ stl c++11

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