我正在尝试在GCC 4.8.1上编译this source:
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
。这有什么用途?我不知道我可以使用哪些关键字来搜索这些信息。
答案 0 :(得分:3)
::
是C ++中的范围解析运算符。它用于在全局命名空间中显式调用函数。
您得到的错误是因为编译器无法在全局命名空间中找到memalign
函数。要使用它,您需要包含malloc.h
头文件。
请注意,就我所知,它也是一个POSIX扩展,因此它可能在您的环境中不可用。例如,如果您尝试使用MinGW或Microsoft的工具链编译代码,则它将无法使用。您需要找到替代品,例如this one或this one。
从我在网上看到的内容来看,它也已被弃用,即使在可用的环境中也是如此。这很有道理,因为内置于所有现代操作系统中的内存分配机制已经返回了对齐的内存。你根本不需要它。
答案 1 :(得分:0)
您需要#include <malloc.h>
才能使用memalign
。
或#include <cstdlib>
并改为使用posix_memalign
。
::
中的::memalign
告诉编译器在全局命名空间中查找该函数。