91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在C++項目中實現一個aligned_malloc方法

發布時間:2021-03-09 15:26:17 來源:億速云 閱讀:190 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關如何在C++項目中實現一個aligned_malloc方法,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

malloc的默認行為

int main()
{
  void *p = malloc(1024);
  printf("0x%p\n", p);
  free(p);
}

請求了一個大小為1024的內存塊并打印出來,一切都很完美。
我們看看這塊內存的地址。

如何在C++項目中實現一個aligned_malloc方法

可以看到,在64bit機器上,malloc默認行為會將分配的地址以16-byte對齊,如果我們想改變這種默認行為,提供32-byte或者64-byte對齊,應該怎么做呢?

實現aligned_malloc

源代碼

從C++17開始,可以使用aligned_alloc函數達到這個目的,但是如果使用較老的C++版本,如C++14,C++11,我們需要手動寫一個實現。
話不多說,先貼代碼如下,aligned_malloc和aligned_free,需要配合使用,否則會有內存泄漏問題。

#include <memory>

void* aligned_malloc(size_t size, size_t alignment)
{
	size_t offset = alignment - 1 + sizeof(void*);
	void * originalP = malloc(size + offset);
	size_t originalLocation = reinterpret_cast<size_t>(originalP);
	size_t realLocation = (originalLocation + offset) & ~(alignment - 1);
	void * realP = reinterpret_cast<void*>(realLocation);
	size_t originalPStorage = realLocation - sizeof(void*);
	*reinterpret_cast<void**>(originalPStorage) = originalP;
	return realP;
}

void aligned_free(void* p)
{
	size_t originalPStorage = reinterpret_cast<size_t>(p) - sizeof(void*);
	free(*reinterpret_cast<void**>(originalPStorage));
}

int main()
{	
	void * p = aligned_malloc(1024, 64);
	printf("0x%p\n", p);
	aligned_free(p);
	return 0;
}

添加一個測試程序,

#include <assert.h>

void TestAlignedMalloc()
{
  const int size = 100;
  const int alignment = 64;
  void* testArray[size];
  for (int i = 0; i < size; ++i)
  {
    void * p = aligned_malloc(1024, alignment);
    assert((reinterpret_cast<size_t>(p) & (alignment - 1)) == 0);
    printf("0x%p\n", p);
    testArray[i] = p;
  }
  for (int i = 0; i < size; ++i)
  {
    aligned_free(testArray[i]);
  }
}

int main()
{
  TestAlignedMalloc();
  return 0;
}

看看結果,

如何在C++項目中實現一個aligned_malloc方法

分配的內存地址都是以64-byte為邊界,并且分配的內存最后也被成功釋放了,函數是正確的。

源代碼說明

本小段主要向不大了解解決思路的小伙伴做一些簡單解釋,程序大佬可以一笑而過哈。

首先我們要明確我們的解決方案,既然malloc分配的指針地址不能達到我們想要的字節對齊效果,我們就自己來調整這個指針。所以我們的做法是

  • 比用戶實際需要的多分配一些內存,多分配的部分等于對齊大小減一再加上指針大小。加上對齊大小減一很好理解,是為了之后的對齊做準備,而加上指針大小是為了之后有空間保存原始指針,對應分配函數中的前2行

  • 在malloc返回的原始指針的基礎上,加上指針大小,再對齊(采用的方法就是加上對齊大小減1再做位運算),這個運算結果就是我們想要的對齊后的指針,也是我們返回給用戶的指針,對應分配函數中的3~5行

  • 我們還需要保存malloc返回的原始指針,否則free的時候會出問題。這時我們之前多分配的一個指針大小就有用武之地了,保存原始指針在那個地址,分配函數的最后幾行就在做這個事

  • 當free的時候,我們知道原始指針存放在我們使用的指針的前一個指針大小偏移的內存里面,通過一些運算取得這個內存地址,再根據里面存放的原始指針調用free完成內存釋放

關于如何在C++項目中實現一個aligned_malloc方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

图木舒克市| 长白| 大丰市| 抚宁县| 通海县| 阜南县| 平谷区| 乌什县| 城固县| 定南县| 新乐市| 怀化市| 泰来县| 尼木县| 米易县| 盱眙县| 龙州县| 连城县| 那曲县| 卢湾区| 赤壁市| 贡觉县| 牟定县| 扎囊县| 天柱县| 武陟县| 监利县| 合阳县| 道真| 大同市| 扬中市| 三亚市| 尖扎县| 黑水县| 舞阳县| 巴彦县| 台州市| 洛浦县| 光山县| 威信县| 海兴县|