我有一個 Arduino Micro,上面焊接了 3 個飛行時間 LIDAR 微型傳感器。在我的代碼中,我創建了 3 個全域變數,如下所示:
Adafruit_VL53L0X lox0 = Adafruit_VL53L0X();
Adafruit_VL53L0X lox1 = Adafruit_VL53L0X();
Adafruit_VL53L0X lox2 = Adafruit_VL53L0X();
它占用了大約 80% 的記憶體 現在我正在像這樣創建我的物件
Adafruit_VL53L0X *lox_array[3] = {new Adafruit_VL53L0X(), new Adafruit_VL53L0X(), new Adafruit_VL53L0X()};
它占用了我整個程式的 30%
我嘗試查看 arduino 檔案,但找不到任何可以幫助我的內容。我可以理解創建一個“經典”物件可以填滿記憶體。但是創建指標時記憶體區域在哪里?
uj5u.com熱心網友回復:
無論哪種方式,您都使用相同數量的記憶體。(實際上,第二種方法使用一點點更多,因為指標需要被存盤。)
只是第一種方式,記憶體已經從程式的開始和部分資料大小開始靜態分配,所以你的編譯器可以告訴你,而第二種方式,記憶體在運行時動態分配(在堆上),所以你的編譯器事先不知道它。
我敢說第二種方法更危險,因為考慮以下場景:假設您的其他代碼和資料在編譯時已經使用了 90% 的記憶體。如果您使用第一種方法,您將無法上傳程式,因為它現在會使用 150% 之類的東西,所以您已經知道它不會作業。但是,如果您使用第二種方法,您的程式將可以很好地編譯和上傳,但是在嘗試在運行時分配額外記憶體時會崩潰。
(順便說一句,編譯器訊息有點不完整。它應該說“為區域變數和動態分配的物件留下 1750 個位元組”或類似的內容)。

你可以使用這個函式自己檢查它,它允許你估計運行時的空閑記憶體量(通過比較堆的頂部和堆疊的底部[物理上,而不是邏輯上],后者通過查看地址來實作一個區域變數,該變數將在該點分配在堆疊中):
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
另見:https : //playground.arduino.cc/Code/AvailableMemory/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314997.html
下一篇:使用介面的GO型別轉換和賦值
