[C++] 32 kB的編譯代碼是多少


Answers

你不能在那裡說。 未編譯代碼的長度與編譯代碼的長度沒有多大關係。 例如:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

int main()
{
  std::vector<std::string> strings;
  strings.push_back("Hello");
  strings.push_back("World");
  std::sort(strings.begin(), strings.end());
  std::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, ""));
}

VS

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

int main()
{
  std::vector<std::string> strings;
  strings.push_back("Hello");
  strings.push_back("World");
  for ( int idx = 0; idx < strings.size(); idx++ )
    std::cout << strings[idx];
}

兩者的行數完全相同,並且產生相同的輸出,但是第一個例子涉及std :: sort的實例化,這可能比這裡的其餘代碼多一個數量級的代碼。

如果您絕對需要對程序中使用的字節數進行計數,請使用彙編程序。

Question

我打算使用Arduino可編程電路板 。 那些存儲範圍在16到128kB之間的閃存非常有限,用於存儲已編譯的C或C ++代碼。

是否有方法來估計它將代表多少 (標準)代碼?

我想這是非常模糊的,但我只是在尋找一個數量級。




在linux系統上,你可以用靜態編譯的示例程序做一些實驗。 例如

$ size `which busybox `
text            data    bss     dec     hex filename
1830468    4448   25650 1860566  1c63d6 /bin/busybox

大小以字節為單位給出。 該輸出與可執行文件格式無關,因為文件格式內的不同部分的大小。 文本部分包含機器代碼和const的東西。 數據部分包含變量靜態初始化的數據。 bss大小是未初始化數據的大小 - 當然,未初始化的數據不需要存儲在可執行文件中。)

那麼, busybox包含了很多功能(如所有常見的shell命令,shell等)。

如果您將自己的示例與gcc -static關聯起來,請記住,您使用的libc可能會大大增加程序大小,並且使用嵌入式libc可能會更節省空間。

要測試你可以檢查出飲食libcuclibc和鏈接。 實際上,busybox通常與uclibc鏈接。

請注意,以這種方式獲得的尺寸只能提供一個數量級 。 例如,您的工作站可能使用另一個CPU架構,而不是arduino板,不同架構的機器代碼可能在大小上有所不同(因為操作數大小,可用指令,操作碼編碼等等)。

為了進行粗略的推理,busybox包含了大約309個工具 (包括ftp守護進程等),也就是說busybox工具的平均代碼大小約為5k​​。




嘗試創建一個簡化版本的應用程序,首先關注最有價值的功能,然後開始添加“好(而且很酷)的東西”。 在驗證代碼時,請注意Arduino IDE中顯示的字節使用情況。

作為一個粗略的指示,我的第一個應用程序(由LED按鈕控制的LED閃光燈)需要1092個字節。 這大概是32k中的1k。 很小的C ++代碼的腳印!

我最擔心的是有限的RAM(1 Kb)。 如果CPU堆棧佔用一部分,那麼創建任何數據結構都沒有太多的餘地。

我只有我的Arduino 48小時,所以仍然有很多有效的使用它;-)但使用:)是很多樂趣。




Links