簡體   English   中英

在 Mac 和 CentOS 上使用 vmalloc (libvmalloc.a) - 不能包含 vmalloc header

[英]Using vmalloc (libvmalloc.a) on Mac and CentOS- cannot include vmalloc header

我想分配幾乎連續的范圍 memory 以便在訪問數據時可以使用位置屬性(空間位置),同時考慮到更好的性能。 我在下一頁發現我需要使用 vmalloc 來獲得更好的 memory 本地訪問(如果我錯了,請糾正我並且必須改用 kmalloc)。

vmalloc 和 kmalloc 有什么區別?

我從http://www2.research.att.com/~gsf/cgi-bin/download.cgi?action=list&name=vmalloc下載了 vmalloc package

我按照安裝過程從源文件構建 libmalloc.a static 庫,然后將生成的 libvmalloc.a 庫復制到我的 mac 上的 /usr/local/lib 和 /usr/lib 目錄。

在我的 C 程序中,我嘗試通過以下各種方法包含 vmalloc.h header 文件:

#include <vmalloc.h>

.

#include <linux/vmalloc.h>

.

#include "vmalloc.h"

但他們都沒有工作。 我總是收到vmalloc.h: No such file or directory錯誤消息。 我在編譯 C++ 程序時使用了 -L/usr/local/lib -lvmalloc 標志。 在我的台式計算機上(在 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)

我還嘗試修改我的 Linker 標志,如下所示:

LFLAGS = -O3 -L/usr/local/lib -lvmalloc

我仍然遇到同樣的錯誤。 在這種情況下可能有什么問題? 我鏈接庫的方式有什么問題,還是 vmalloc 僅適用於 Linux 的某些版本? 如果是后一種情況,我相信我至少應該仍然能夠包含 header 文件。

編輯

我真正的問題實際上如下:

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) ) ;
    }     

我想確保每個緩存中的所有 ht_elements 都是按順序創建的。 我從一個論壇上讀到,vmalloc 非常適合創建緩存感知應用程序,因為數據是在虛擬 memory 中創建的。 是否有任何其他方法可以確保我的緩存數組的所有元素的分配都是按連續順序創建的,從而使我能夠進行快速查找? 還有一件事,每個緩存中每個元素的大小都不一樣,所以我猜使用 calloc 不是解決方案,但我可能錯了。

編譯時,為 gcc 指定 -Ipath 以了解“vmalloc.h”在哪里。

或者,在調用 gcc 之前指定環境變量 C_INCLUDE_PATH(對於 C)或 CPLUS_INCLUDE_PATH(對於 C++)。

GCC 將按照以下方式搜索 header 文件:

  1. -Ipath
  2. 環境變量:C_INCLUDE_PATH、CPLUS_INCLUDE_PATH、OBJC_INCLUDE_PATH
  3. 默認路徑(如果您在安裝 gcc 時沒有指定前綴),可能像:

    /usr/包括

    /usr/local/包括

    /usr/lib/gcc-lib/i386-linux/2.95.2/include

    /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3

    /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include

Nemo 的評論應該作為答案給出:

該問題中的vmalloc是Linux kernel function。 除非您正在破解 kernel 或編寫設備驅動程序,否則它與您無關。 AT&T Research 網站上的vmalloc完全是另一回事。 兩者都沒有你認為的那樣。 只需使用malloc

很明顯,您不知道“虛擬連續范圍”是什么意思,或者您會意識到malloc必須給您這個; 否則它根本行不通。

過早的優化是萬惡之源。 特別是當您不知道您嘗試進行的優化意味着什么時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM