簡體   English   中英

fill_n vs memset 設置數組的默認值

[英]fill_n vs memset to set default value of an array

我想知道如果你想用默認值 n 填充數組,理想的方法是什么:

#include <cstring> // for memset
#include <algorithm> // for fill_n

static constexpr int N = 100;
int a[N];
static constexpr int defaultValue = -1;

void* memset( void* dest, int ch, std::size_t count );

memset(a, defaultValue, sizeof(a));

(memset) 將值 ch 轉換為 unsigned char 並將其復制到 dest 指向的 object 的每個第一個 count 字符中。 如果 object 是潛在重疊的子對象或不是 TriviallyCopyable(例如,標量、C 兼容結構或可簡單復制類型的數組),則行為未定義。 如果 count 大於 dest 指向的 object 的大小,則行為未定義。

或者

constexpr OutputIt fill_n( OutputIt first, Size count, const T& value );

fill_n(a, N, defaultValue);

(fill_n) 如果 count > 0,則將給定值分配給從 first 開始的范圍內的第一個 count 元素。否則不執行任何操作。

我正在尋找見解,我當然知道如何閱讀文檔!

編輯:defaultValue 可能不僅僅是-1。

這兩個函數做不同的事情。 當然,他們填充了一塊 memory,但他們這樣做的方式完全不同。

memset在字節級別運行。 defaultValue被破解為unsigned char ,因此大於可以容納單個字節的defaultValue被縮減為大小並且信息丟失。 現在字節大小的值單獨應用於每個字節,而不是數組中的每個int 在 -1 的情況下,您會得到“幸運”,因為 0xFF 的四個字節看起來相同,即 0xFFFFFFFF,作為 32 位整數世界中的二進制補碼 -1。 大多數其他數字沒有這樣的運氣。 例如,1 不會導致一個充滿int的數組設置為 1,而是用 0x01010101 或 16843009 填充。

另一方面, fill_n尊重數組元素的類型。 數組中的每個int都將設置為defaultValue defaultValue為 1 的情況下,數組將充滿 1。 defaultValue為 256,提供一個 256 的數組。

就速度而言,這可能並不重要。 如今,以字節讀取或寫入的 Memory 已很少見。 一次寫入整個int可能會更快。 但是一個好的memset實現知道這一點並將利用它。 如果沒有,編譯器可能會。

暫無
暫無

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

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