一、**
有關下面**,p和q的區別是什麼:
int main(int argc, char *argv)
p和q的區別是:
p 是乙個指標,指向程式 唯讀資料段 的」hello world」,不可以通過p[x] = x 來賦值,因為不能改變唯讀資料段的內容。從上面的描述,可以看到,q相對於p是多了一次拷貝的,具體也可以參考[1],[2],最好的方式是彙編q 是陣列名,也是乙個指標,指向棧上從 唯讀資料段 拷貝來的 「hello world」
gcc -s hello.c -o hello.s
彙編**之後看看(如果需要彙編**和c對比閱讀,可以使用gcc引數,gcc -c -g -wa,-adlhn hello.c > hello.s,如果需要inter風格,可以 -masm=intel):
可以看到第一次指令:movq $.lc0, -8(%rbp)
直接把存在.lc0
的唯讀資料」hello world」儲存在了暫存器rbp中。
第二次有兩個指令,分別是movabsq $8022916924116329800, %rax
和movq %rax, -32(%rbp)
第一句是吧hello world
[3]移動到了rax
中,然後把rax
的內容移動到了rbp
棧基址暫存器中,也就是前面說的多了一次拷貝,這個操作相當於複製。
對於程式中不需要修改的常量字串,定義成char *
而不是char
,可以提公升程式的效率,畢竟少一次拷貝,這種情況常見於日誌輸出的時候。char *init = "init success"
,char *p = "startup fail"
等等。
參考資料:
[1] what is the difference between char s and char *s?
[2] what is the difference between these initializations?
[3] 為什麼是hello world?
[4] x64彙編參考
[5] x64暫存器
char 和char 的區別
1 char是乙個陣列定義,char 是指標定義 也稱char為靜態陣列,char 為動態陣列 2 指標和陣列的區別 1 指標和陣列的分配 陣列是開闢一塊連續的記憶體空間,陣列本身的識別符號 也就是通常所說的陣列名 代表整個陣列,可以使用sizeof來獲得陣列所佔據記憶體空間的大小 注意,不是陣列元...
char 和char 的區別
char c abc c 0 t char c1 def c1 0 t err 首先c1是乙個指標,它只是指向 def 這個記憶體塊。而 abc 是乙個常量區,不可以對其進行更改。而c定義的是乙個陣列,在分配記憶體時,會自動給它分配四個位元組的位址,並且會進行乙份拷貝工作,此時分配是在棧區進行的,是...
char 和char 的區別
之前在用到char 和char,用到srtncat,讓char對char 進行新增時執行會崩潰,之後做了一些分析和練習,對char 和char有了更深的理解。下面附上一些測試資料。include include include using namespace std int main cout do...