簡體   English   中英

在資源有限的平台上使用 memset 設置 memory?

[英]Setting a memory using memset on a platform having limited resources?

我需要將一大塊 memory (32-bit float s) 清零,然后使用my_set()

static inline void my_set(float *dst, float v, int n)
{
    while (n-- > 0)
        *(dst++) = v;
}

#define MY_SIZE 1024 

int main()
{
    float my_mem[MY_SIZE];

    my_set(&my_mem, 0.0f, MY_SIZE)

}

我應該改用memset()嗎? 它會在資源有限的平台上表現更好嗎? GCC會優化my_set以使用memset嗎?

似乎它會: 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.

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