2013-08-20 65 views
0

编译我试图编译this source在GCC 4.8.1:代码失败在G ++ 4.8

g++ -std=c++11 -D DCACHE1_LINESIZE=64 lockfree_rb_q.cpp -lpthread -o 
lockfree_rb_q.exe 

但我得到一个编译器错误,我不明白:

lockfree_rb_q.cpp:171:22: error: '::memalign' has not been declared 
    thr_p_ = (ThrPos *)::memalign(getpagesize(), sizeof(ThrPos) * n); 

问题的代码行是:

ptr_array_ = (T **)::memalign(getpagesize(),Q_SIZE * sizeof(void *)); 

我知道什么是memalign,什么是对,但在这个源代码中,我不知道为什么作者在memalign之前添加了::。这有什么用途?我不知道我可以使用哪些关键字来自己搜索这些信息。

回答

2

::是C++中的作用域解析运算符。它用于在这里显式调用全局名称空间中的函数。

您得到的错误是因为编译器在全局名称空间中找不到memalign函数。为了使用它,你需要包含malloc.h头文件。

请注意,它也是一个POSIX扩展,据我所知,所以它可能无法在您的环境中使用。例如,如果您尝试使用MinGW或Microsoft的工具链编译代码,则它将不可用。您将需要找到替代品,如this onethis one

从我在线阅读的内容来看,它也被弃用,即使在可用的环境中也是如此。这很有意义,因为内置于所有现代操作系统的内存分配机制已经返回对齐的内存。你可能根本不需要它。

+0

谢谢,我真的在MinGW,这可能是我包括malloc.h仍然无法编译的原因! – barfatchen

+0

AFAICT,'memalign()'被弃用,'posix_memalign()'不是。在某些情况下,可能需要页面对齐的内存而不是默认对齐。 – Hasturkun

+0

MinGW在Windows平台上可能不支持。如果'_aligned_malloc'可用(就像它在Microsoft的C运行时库中一样),那么可以使用它。否则,您将需要编写自己的实现。这是相当简单的,只是'malloc'的简单包装。 –

0

您需要#include <malloc.h>才能使用memalign

#include <cstdlib>并使用posix_memalign代替。

::memalign中的::告诉编译器在全局名称空间中查找函数。

+0

谢谢,我现在明白了,谢谢你的信息 – barfatchen