我目前正在使用不同語言設置的項目。爲了解決這個問題,一個表格用來存儲程序中使用的不同語言的所有文本。因此,無論何時要在屏幕上寫入文本,都會調用此表,並根據當前語言設置是什麼返回文本字符串。我最近加入了這個項目,並且我注意到這種存儲方式並沒有得到很好的優化,每增加一種新語言,查找正確字符串的時間就會增加。因此,我想出了一個(在我看來)更好的解決方案。然而,當我試圖實現它時,我遇到了一個錯誤,即使用了太多的內存,我不明白爲什麼。我正在使用IAR嵌入式工作臺。錯誤[Lp001]內存不足時我不應該
僞/ C初始溶液++代碼:
typedef struct
{
enum textId;
enum language;
string textString;
} Text;
static const Text s_TextMap[] =
{
{ TextId::RESTORE_DATA_Q ,Language::ENGLISH ,"Restore Data?" },
{ TextId::RESTORE_DATA_Q ,Language::SWEDISH ,"Återställa data?" },
{ TextId::RESTORE_DATA_Q ,Language::GERMAN ,"Wiederherstellen von Daten?" },
{ TextId::CHANGE_LANGUAGE ,Language::ENGLISH ,"Change Language" },
{ TextId::CHANGE_LANGUAGE ,Language::SWEDISH ,"Välj språk" },
{ TextId::CHANGE_LANGUAGE ,Language::GERMAN ,"Sprache wählen" },
};
我在僞/ C溶液++代碼:
typedef struct
{
const char* pEngText;
const char* pSweText;
const char* pGerText;
} Texts;
static Texts addTexts(const char* pEngText, const char* pSweText, const char* pGerText)
{
Texts t;
t.pEngText = pEngText;
t.pSweText = pSweText;
t.pGerText = pGerText;
return t;
}
typedef struct
{
enum textId;
Texts texts;
} Text;
static const TextTest s_TextMapTest[] =
{
{TextId::RESTORE_DATA_Q, addTexts("Restore Data?","Återställa data?","Wiederherstellen von Daten?")},
{TextId::CHANGE_LANGUAGE, addTexts("Change Language","Välj språk","Sprache wählen")},
};
我的解決辦法是明顯快於平均水平的情況下,以查找並根據我計算它也應該使用更少的內存。當使用完整表格時,我計算出原始解決方案需要7668個字節,而且我的解決方案需要4248個字節。我這樣做的方式是在一個小的測試程序中實現完整的表格,並使用sizeof(s_TextMap)。然而,當我嘗試編譯的代碼我得到的鏈接錯誤說:
錯誤[Lp011]:部分放置未能 無法爲具有0x130301字節的總估計最小尺寸段/塊分配空間(最大對齊0x1000)在< [0x0000a000-0x0007ffff]>(未提交的總空間0x757eb)。
錯誤[Lp011]:部分放置失敗 無法與0x47de4字節< [0x1fff0000-0x2000fff0]>(總未提交的空間0x1fff1)總估計最小尺寸(最大對齊爲0x20),用於分段/塊分配空間。
錯誤[Lp021]:壓縮初始化程序批次「USER_DEFAULT_MEMORY-1」的目標位置取決於批處理的大小,這在使用lz77壓縮時不允許。考慮使用「初始化通過包裝=零複製」(或無)來代替。
錯誤[Lp021]:壓縮初始化程序批次「USER_DEFAULT_MEMORY-1」的目標位置取決於批處理的大小,這在使用lz77壓縮時不允許。考慮使用「初始化通過包裝=零複製」(或無)來代替。
我最困惑的錯誤是第一個說我的代碼估計需要0x130301字節的內存,我看不出這是可能的。這可能是IAR中的一些錯誤,或者我錯過了什麼?