在Mac和CentOS上使用vmalloc(libvmalloc.a)-不能包含vmalloc头
我想分配几乎连续的范围内存,以便在访问数据时可以使用Location属性(空间局部性),同时考虑到更好的性能。我在下一页发现,我需要使用vmalloc来更好地访问内存位置(如果我错了,请纠正我,并改用kmalloc) 我从下载了vmalloc包 我按照安装过程从源文件构建libmalloc.a静态库,然后将生成的libvmalloc.a库复制到mac上的/usr/local/lib和/usr/lib目录 在我的C程序中,我尝试通过以下各种方法包括vmalloc.h头文件:在Mac和CentOS上使用vmalloc(libvmalloc.a)-不能包含vmalloc头,c,static-libraries,static-linking,vmalloc,C,Static Libraries,Static Linking,Vmalloc,我想分配几乎连续的范围内存,以便在访问数据时可以使用Location属性(空间局部性),同时考虑到更好的性能。我在下一页发现,我需要使用vmalloc来更好地访问内存位置(如果我错了,请纠正我,并改用kmalloc) 我从下载了vmalloc包 我按照安装过程从源文件构建libmalloc.a静态库,然后将生成的libvmalloc.a库复制到mac上的/usr/local/lib和/usr/lib目录 在我的C程序中,我尝试通过以下各种方法包括vmalloc.h头文件: #include &
#include <vmalloc.h>
但没有一个成功。我总是收到vmalloc.h:没有这样的文件或目录错误消息。
在编译我的C++程序时,我使用了L/USR/PLACE/LIB -LVMLALC标志。
在我的台式计算机(在CentOS操作系统下)上尝试相同的操作时,我也遇到了相同的错误。这是我的makefile:
SHELL = /bin/sh
PROJECT = hw2
TARGET = mkhashtbl
CFLAGS = -O3
LFLAGS = -O3 -L/usr/local/lib -lvmalloc
TFILE = $(PROJECT).tgz
ZFILE = $(PROJECT).zip
PACKFILES = Makefile hashtbl.h hashtbl.c mkhashtbl.c timer.c
all: $(TARGET)
run: all
- ./$(TARGET)
我还尝试修改我的链接器标志,如下所示:
LFLAGS = -O3 -L/usr/local/lib -lvmalloc
我还是犯了同样的错误。
在这种情况下会有什么问题?我链接库的方式是否有问题,或者vmalloc是否只适用于某些版本的Linux?如果是后一种情况,我确信我至少仍然能够包含头文件
编辑
我真正的问题是:
hashtbl_cache * hashTable_cache; /* Hash table cache */
int i;
hashTable_cache = (hashtbl_cache*)malloc(tbl_size* sizeof(hashtbl_cache));
for( i = 0 ; i < tbl_size; i++ )
{
hashTable_cache[i]. ht_elements = (hashelt_cache*)malloc( hashTable->data_total_size[i] * sizeof(hashelt_cache) ) ;
}
hashtbl_缓存*hashTable_缓存;/*哈希表缓存*/
int i;
hashTable_cache=(hashtbl_cache*)malloc(tbl_size*sizeof(hashtbl_cache));
对于(i=0;idata_total_size[i]*sizeof(hashelt_cache));
}
我想确保每个缓存中的所有ht_元素都是按顺序创建的。我从一个论坛上读到,vmalloc非常适合创建支持缓存的应用程序,因为数据是在虚拟内存中创建的。有没有其他方法可以确保缓存数组中所有元素的分配都是按连续顺序创建的,从而使我能够快速查找?还有一件事,每个缓存中每个元素的大小都不一样,所以我想使用calloc不是一个解决方案,但我可能错了。编译时,请指定-Ipath以便gcc知道“vmalloc.h”在哪里 或者,在调用gcc之前指定环境变量C_INCLUDE_PATH(对于C)或CPLUS_INCLUDE_PATH(对于C++) GCC将按照以下方式搜索头文件:
尼莫的评论本应作为回答:
这个问题中的
vmalloc
是一个Linux内核函数。除非您正在破解内核或编写设备驱动程序,否则它与您无关。at&T研究站点的vmalloc
完全是另一回事。两个人都不是你想象的那样。只需使用malloc
很明显,你不知道“几乎连续的范围”是什么意思,或者你会意识到malloc
必须给你这个;否则,它根本不会起作用
过早优化是万恶之源。尤其是当你不知道你试图进行的优化意味着什么时。这个问题中的
vmalloc
是一个Linux内核函数。除非您正在破解内核或编写设备驱动程序,否则它与您无关。at&T研究站点的vmalloc
完全是另一回事。两个人都不是你想象的那样。只需使用malloc
。是的,我试过使用malloc。现在我想创建一个缓存感知哈希表。如果我使用malloc,哈希表的每个元素将位于不同的内存地址上,对吗?因此,在访问哈希表中的数据时,我将无法使用Location属性。我的假设是,如果使用vmalloc,哈希表的所有数据项都将在一个连续的大数据块中创建,因此访问数据会更快。另一个问题:如果它是linux内核函数,为什么我不能将其包含在CentOS计算机上?文件vmalloc.h
在您的文件系统中的哪里?当您知道这一点时,您将知道向-I
选项添加什么值。请注意,-L
选项与链接时查找库有关,而与编译时查找标题无关。另外,库在哪里(libvmalloc.so
或libvmalloc.a
)。如果在libvmalloc的build区域之外找不到头文件,则需要从build重新安装它,或者重做build并确保安装了头文件(或者手动安装)。libvmalloc.a位于/usr/local/lib目录中。vmalloc.h包含在libvmalloc.a的构建中。感谢您澄清-I和-L之间的区别。我已经在我的.bashrc和.bash_配置文件中这样做了。因此,include路径是自动获取的。甚至我也使用了-I和-L标志来手动指定路径。所以这不是问题所在。gcc似乎在预处理阶段就停止了,仍然无法找到正确的包含路径。您确定您指定的-I选项是正确的路径吗?PS:L-L选项用于链接而不是编译,问题发生在它们生效之前。感谢您的澄清。我编辑了我的问题,并澄清了我想要实现的目标。你不喜欢什么
LFLAGS = -O3 -L/usr/local/lib -lvmalloc
hashtbl_cache * hashTable_cache; /* Hash table cache */
int i;
hashTable_cache = (hashtbl_cache*)malloc(tbl_size* sizeof(hashtbl_cache));
for( i = 0 ; i < tbl_size; i++ )
{
hashTable_cache[i]. ht_elements = (hashelt_cache*)malloc( hashTable->data_total_size[i] * sizeof(hashelt_cache) ) ;
}