關於c++中的char和bool
起因
今天刷OJ發現一個有意思的事兒。題目中需要計算一定範圍內的質數,我申請了一個數組,所有元素有0、1、-1三種狀態。如果陣列使用int的話用時240ms,36M記憶體。如果換成char就變成了140ms,9M記憶體。這就引出了兩個問題:1. 為什麼變快了;2. char原來是有符號的?
char的符號
這個問題很好解決,Google之後發現C標準中將char規定為Implementation Defined(由實作環境決定)。具體而言,arm平臺上char是無符號的,而intel平臺上char是有符號的。
如果想驗證的話,在自己的平臺上給char賦值128,如果是無符號整數那麼輸出應該還是128,如果是有符號整數那麼輸出應該是-128。
char的計算
缺乏這方面知識,查完相關資料在補充這段吧。
bool的儲存
跟同學的程式碼進行對比之後我又發現一個問題:他的陣列使用的是bool,但記憶體消耗跟我一樣!這說明bool雖然只有0和1兩種狀態,但在記憶體中卻佔用了一個byte而非一個bit。
如果想驗證的話,申請一個bool陣列,全部賦值為1,然後一個byte一個byte往外讀。如果是按bit儲存,這個位元組內容應該是11111111,如果是按byte儲存,應該是00000001。
相關推薦
C++中char *和char []的區別
以前一直覺得這兩個有區別,但也沒深究,今天寫了個程式碼報了警告於是就看了看,總結如下。 例如如下程式碼: #include<iostream> using namespace std; int main() { char *p1
關於c++中的char和bool
起因 今天刷OJ發現一個有意思的事兒。題目中需要計算一定範圍內的質數,我申請了一個數組,所有元素有0、1、-1三種狀態。如果陣列使用int的話用時240ms,36M記憶體。如果換成char就變成了140ms,9M記憶體。這就引出了兩個問題:1. 為什麼變快了;
c++ 中 string 和 const char * 中的相同和不同,遇到的坑。
#include<iostream> #include<string> using namespace std; string ToString(int i) { string str = std::to_string(i); return str; } int mai
C#和C++中char型別的區別
對於char,這個字元型別。我們一般都認為就是一個位元組。今天在仔細比較發現,C#的char和C++的char是有區別的。 1.首先來看C#中char佔多大空間 using System; using System.Collections.Generic; usin
C#中&和&&,|和||區別
.com blank img cnblogs png ref bsp 筆記 區別 當兩者都為邏輯運算符時。 其實沒什麽差別。 &&和||當已經確定結果時,不會對第二個操作數求值。也不知道什麽情況會用到這個差別。做個筆記好了。 http://blog.cs
C++中typename和class的區別
type .get true 能夠 class .... ray pla 依賴 在c++Template中很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢? 相信學習C++的人對class這個關鍵字都非常明白,clas
C++中數字和字符串的轉換
oat 不能 ring1 相關 輸出 displays tof spl 進制轉換 1、字符串數字之間的轉換(1)string --> char * string str("OK"); char * p = str.c_str();(2)char * -->
C++中static_cast和dynamic_cast強制類型轉換
tro 父類 虛函數表 找到 virt 內部 pub 判斷 () 在C++標準中,提供了關於類型層次轉換中的兩個關鍵字static_cast和dynamic_cast。 一、static_cast關鍵字(編譯時類型檢查) 用法:static_cast < type-i
C++中的#和##運算符
合並操作 col 否則 未定義 info merge eight 標識符 轉換 #和##運算符 #:構串操作符 構串操作符#只能修飾帶參數的宏的形參,它將實參的字符序列(而不是實參代表的值)轉換成字符串常量 #define STRING(x) #x#x#x #defin
c#中Class和Struct使用與性能的區別
回收 數據結構 com 垃圾回收 父類 改變 med .cn 指針 在Unity中很多已經定義為結構體的數據結構 Vector2, Vector3 和 Vector4 Rect Color和Color32 Bounds Touch 1.Class為引用類型,Str
C#中Monitor和Lock以及區別
能夠 program tor 試圖 tro 指定 object span () 原文地址:http://www.cnblogs.com/chengxingliang/p/3150731.html Monitor對象 1.Monitor.Enter(object)方法
C#中Convert和parse的區別
處理 捕獲 用戶 整數 request 存在 query 轉換 中間 Convert.ToInt32()與int.Parse()的區別(1)這兩個方法的最大不同是它們對null值的處理方法: Convert.ToInt32(null)會返回0而不會產生任何異常,但int.P
C#中&和&&的區別
poi log sha 與操作 位運算 orm 第一個 pre 繼續 SiKi老師讓我們自行查一下&和&&的區別,So... 1)&和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都為tru
C/C++中near和far的區別
語言 補充 detail net 計算機體系結構 偏移 單元 體系結構 all C/C++中near和far的區別 關鍵字near和far受目標計算機體系結構的影響。目前編程中使用不多。 near關鍵字創建一個指向可尋址內存低端部分的目標指針。這些
C#中virtual和abstract的區別
tool 保留 到你 variable var 入口 printf static write 解讀一 c# 中 Abstract和Virtual比較容易混淆,都與繼承有關,並且涉及override的使用。下面討論一下二者的區別: 一、Virtual方法(虛方法) vir
C#中Get和Post請求的同步及異步方法
iter epo charset result string pty streambuf div httpget 在C#中發起Http請求一般使用HttpWebRequest這個類,下文將使用這個HttpWebRequest對象來對Get和Post的同步及異步請求進行封裝:
C#中Abstract和Virtual的區別
保留 一個 strac 虛擬 ati AI 靜態方法 void ride c# 中 Abstract和Virtual比較容易混淆,都與繼承有關,並且涉及override的使用。下面討論一下二者的區別: 一、Virtual方法(虛方法) virtual 關鍵字用於在基
C++中const和#define的利弊探索
C++學習 C++學習總結 C++靈感 const和#define的利弊,從而推導const的意義; const和#define都有類似的功能,那就是定義一個“常量”; 想用來替換#define定義常量這種方式。這是一種定義宏的方式。因為宏替換定義常量有一定的缺陷:不做類型檢查,沒有作用域限制(這
c#中 xml和json 互相轉換
XML serialize AD -- ldo data nod load str --xml轉json XmlDocument doc = new XmlDocument(); doc.LoadXml(result); st
C++中char類型的十六進制字符串轉換成字節流
toupper 14. 轉換成 urn 類型 else con src for 如a[5]="1234"轉換成a[5]={0x12,0x34} 代碼如下: void HexStrToByte(const char* source, unsigned char* dest