本篇目的:
- 了解c/c++的基本數(shù)據(jù)類型有哪些
- 測試基本數(shù)據(jù)類型在各個平臺前方,各個編譯器下的sizeof長度
- 了解c/c++交叉編譯概念
如果想編寫跨平臺的c/c++程序,第一個要了解的就是基本數(shù)據(jù)類型在各操作系統(tǒng)喝峦,各個cpu架構(gòu)下,各個編譯器中的字節(jié)長度!
1. c/c++中的基本數(shù)據(jù)類型有哪些:
- [unsigned] char
- [unsigned] short
- [unsigned] int
- [unsigned] long
- [unsigned] long int
- [unsigned] long long
- float
- double
- long double
- wchar_t(c99)
- bool(c++增加的數(shù)據(jù)類型,c中沒有bool類型)
補充說明:c99中<stdbool.h>中定義了bool類型呜达,sizeof(bool) = 1 byte - 指針(應(yīng)該不是基本類型吧谣蠢,但是sizeof的結(jié)果很重要,也一并放在此處)
2. 測試程序:
#include <stdio.h>
void print_pds_size()
{
printf("sizeof(char) = %d bytes\n", sizeof(char));
printf("sizeof(short) = %d bytes\n", sizeof(short));
printf("sizeof(int) = %d bytes\n", sizeof(int));
printf("sizeof(long) = %d bytes\n", sizeof(long));
printf("sizeof(long int) = %d bytes\n", sizeof(long int));
printf("sizeof(long long) = %d bytes\n", sizeof(long long));
printf("sizeof(float) = %d bytes\n", sizeof(float));
printf("sizeof(double) = %d bytes\n", sizeof(double));
printf("sizeof(long double) = %d bytes\n", sizeof(long double));
printf("sizeof(bool) = %d bytes\n", sizeof(bool));
printf("sizeof(wchar_t) = %d bytes\n", sizeof(wchar_t));
int a = 0;
printf("sizeof(pointer) = %d bytes\n", sizeof(&a));
printf("\n");
}
在各個編譯器中運行結(jié)果:
- vs2015 32bit:
- vs2015 64bit:
- android ndk(windows版模擬器):
由于android ndk不支持printf輸出查近,而需要使用其log輸出漩怎,因此修改一下代碼,以斷點debug方式顯示結(jié)果嗦嗡。更好的方式應(yīng)該是抽象一個針對各個平臺接口一致的接口函數(shù)
兩塊芯片(arduino nano/esp32):
- 16bit 芯片(arduino tool chain):
- 32bit 芯片(arduino tool chain):
- 樹莓派3B(linux arm32)
type | vc32 | vc64 | android | arduino nano | esp32 | 樹莓派 | ios |
---|---|---|---|---|---|---|---|
char | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
short | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
int | 4 | 4 | 4 | 2 | 4 | 4 | 4 |
long | 4 | 4 | 4 | 4 | 4 | 4 | 8 |
long int | 4 | 4 | 4 | 4 | 4 | 4 | 8 |
long long | 8 | 8 | 8 | 8 | 8 | 8 | 8 |
float | 4 | 4 | 4 | 4 | 4 | 4 | 4 |
double | 8 | 8 | 8 | 4 | 8 | 8 | 8 |
long double | 8 | 8 | 8 | 4 | 8 | 8 | 16 |
bool | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
wchar_t | 2 | 2 | 4 | 2 | 2 | 4 | 4 |
指針 | 4 | 8 | 4 | 2 | 4 | 4 | 8 |
結(jié)論:
1. 從指針的字節(jié)數(shù)可以知道當(dāng)前平臺是8/16/32/64位
2. android 模擬機上運行的是32位apk勋锤,真機上應(yīng)該是64位的吧?
3. wchart_t在utf8表示的機器上都是占用4個byte,只有windows才是2byte,至于mcu就略過:本來就1-2k內(nèi)存侥祭,還能指望unicode?
4. 除了指針字節(jié)數(shù)與32/64位機相關(guān)之外叁执,其他數(shù)據(jù)類型在32/64位字節(jié)數(shù)基本是一致的,有區(qū)別的是編譯器矮冬。例如ios clang/llvm long是8字節(jié)谈宛,其他都是4字節(jié)
綜上所述: 如果想編寫跨平臺的c/c++代碼,你第一步就需要了解數(shù)據(jù)類型胎署,然后定義各個平臺的編譯宏吆录,根據(jù)編譯宏typedef 各種數(shù)據(jù)類型,從而達到一致性G砟痢;煮荨!
3. 什么是交叉編譯:
簡單地說巨坊,就是在一個平臺上生成另一個平臺上的可執(zhí)行代碼
例如: 我在windows上編譯出了android(arm)/嵌入式(兩塊小芯片)的可執(zhí)行代碼撬槽。這就是交叉編譯。
4.一些說明:
之所以取名閑聊趾撵,就是空閑的時候隨便聊聊侄柔,想到什么就寫什么。
內(nèi)容主要涉及c/c++:
- 跨平臺編程
- 跨語言互調(diào)
- 常用庫編譯
計劃:每周兩篇c/c++方面的閑聊
忍不住吐槽一下占调,好久沒用android了暂题,順便從as2.2升級到2.3,想不到花了很久時間究珊,占了好多個g的硬盤薪者,好漫長的等待!(晚上更新苦银,時間太長啸胧,睡一覺發(fā)現(xiàn)終于好了)(