[英]Setting a memory using memset on a platform having limited resources?
似乎它會: https://godbolt.org/z/hP8jr1odP
似乎它取決於架構和數組大小,但通常會針對memset
進行優化: https://godbolt.org/z/YqnrEfPGY
#define MY_SIZE 1024 * 1024
static inline void my_set(float *dst, float v, int n)
{
while (n-- > 0)
*(dst++) = v;
}
float my_mem[MY_SIZE];
int main()
{
my_set(my_mem, 0.0f, MY_SIZE);
}
數組大小\架構 | x86_64 | arm | arm64 | risc-v |
---|---|---|---|---|
1 KB | 環形 | 內存集 | 內存集 | 內存集 |
1 兆字節 | 內存集 | 內存集 | 內存集 | 內存集 |
盡管如此,我還是相信編譯器知道什么是最好的,而不用太擔心。
我應該改用 memset() 嗎?
是的。
它會在資源有限的平台上表現更好嗎?
是的。 或者它至少不會表現得更糟。
GCC 會優化 my_set 以使用 memset 嗎?
是的,不,也許。 當使用-ffreestanding
(嵌入式系統目標)編譯時,它會嘗試不包含任何庫調用,然后丟棄任何memset
調用。 否則,在類似 PC 的環境中,機器代碼似乎可以歸結為memset
調用。
請注意,將某些內容顯式設置為零或將其設置為一個值將生成非常不同的機器代碼。
memset
和類似的庫函數經過優化,可以在 CPU 的數據寬度上表現良好。 這不一定與浮點數的數據寬度相同,通常為 32 位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.