我正在玩,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.
我的猜测是预处理器剥离出来的情况下,&*和*&之前,他们甚至得到了编译器,因为他们否定对方,但我无法找到任何文件,以验证这是否是标准ç或编译器特定的.
被预处理器剥离出来&*,并*&和我可以期待从任何给定的编译器这种行为?
我正在尝试编写一些多线程代码来从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) 我有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)
但这是一个语法错误.
有没有办法做到这一点?(或者在不提供类型实例的情况下传入类型的更好方法?)
两部分问题:
我正在研究一个学校项目,使用生命游戏作为试验gpgpu的工具.我正在使用OpenCL和OpenGL进行实时可视化,目标是让这个东西尽可能大而快.在分析时,我发现帧时间由CL获取和释放GL缓冲区控制,并且时间成本与缓冲区的实际大小成正比.
1)这是正常的吗?为什么会这样?据我所知,缓冲区永远不会离开设备内存,而CL Acquire/Release就像互斥锁一样.OpenCL是单独锁定/解锁每个字节还是什么?
为了解决这个问题,我已经从24位RGBA颜色模式(我理解的OpenGL首选颜色模式?)缩小到8位RGB颜色.这导致了主要的加速,但在调整我的内核之后,传输时间再次占据主导地位.
在没有关于如何完全消除传输时间的任何想法(没有将我的内核从OpenCL移植到GLSL,这将超出项目的原始范围),我现在认为我最好的选择是写入位图(与我目前使用的8位像素图相反,然后使用带有颜色索引的位图来构造四边形.
2)我可以使用位图直接纹理四边形吗?我已经考虑过使用glBitmap绘制一个辅助缓冲区,然后使用这个缓冲区来构建我的四边形,但我更愿意使用一个更直接的路径(如果有的话).
当且仅当我删除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位上使用