之前有寫過幾篇關於 const 變數的文章
這次要實驗的程式碼為
反而在 C 上面對預設的 -O0 參數不會執行任何常數字面的最佳化處理
這次要實驗的程式碼為
/* main.c */以及
#include <stdio.h>
void foo(const int* const);
void bar(int);
int main(int argc, char* argv[])
{
const int value = 11;
printf("%d\n", value);
foo(&value);
bar(value);
printf("%d\n", value);
return 0;
}
void foo(const int* const value)
{
int* tmp = (int*) value;
*tmp = 22;
printf("%d\n", *value);
}
void bar(int value)
{
printf("%d\n", value);
}
/* main.cpp */為了要實驗各個參數寫了一個 Makefile
#include <cstdio>
void foo(const int* const);
void bar(int);
using namespace std;
int main(int argc, char* argv[])
{
const int value = 11;
printf("%d\n", value);
foo(&value);
bar(value);
printf("%d\n", value);
return 0;
}
void foo(const int* const value)
{
int* tmp = const_cast<int*>(value);
*tmp = 22;
printf("%d\n", *value);
}
void bar(int value)
{
printf("%d\n", value);
}
all:執行 make 後得到的結果為
$(CC) -Wall -g -O0 main.c -o main-O0
@echo main-O0 && ./main-O0
$(CC) -Wall -g -O1 main.c -o main-O1
@echo main-O1 && ./main-O1
$(CC) -Wall -g -Os main.c -o main-Os
@echo main-Os && ./main-Os
$(CC) -Wall -g -O2 main.c -o main-O2
@echo main-O2 && ./main-O2
$(CC) -Wall -g -O3 main.c -o main-O3
@echo main-O3 && ./main-O3
$(CXX) -Wall -g -O0 main.cpp -o main-O0
@echo main-O0 && ./main-O0
$(CXX) -Wall -g -O1 main.cpp -o main-O1
@echo main-O1 && ./main-O1
$(CXX) -Wall -g -Os main.cpp -o main-Os
@echo main-Os && ./main-Os
$(CXX) -Wall -g -O2 main.cpp -o main-O2
@echo main-O2 && ./main-O2
$(CXX) -Wall -g -O3 main.cpp -o main-O3
@echo main-O3 && ./main-O3
cc -Wall -g -O0 main.c -o main-O0由結果可以看出 C++ 對於 const 變數的處理都一樣
main-O0
11
22
22
22
cc -Wall -g -O1 main.c -o main-O1
main-O1
11
22
11
11
cc -Wall -g -Os main.c -o main-Os
main-Os
11
22
11
11
cc -Wall -g -O2 main.c -o main-O2
main-O2
11
22
11
11
cc -Wall -g -O3 main.c -o main-O3
main-O3
11
22
11
11
g++ -Wall -g -O0 main.cpp -o main-O0
main-O0
11
22
11
11
g++ -Wall -g -O1 main.cpp -o main-O1
main-O1
11
22
11
11
g++ -Wall -g -Os main.cpp -o main-Os
main-Os
11
22
11
11
g++ -Wall -g -O2 main.cpp -o main-O2
main-O2
11
22
11
11
g++ -Wall -g -O3 main.cpp -o main-O3
main-O3
11
22
11
11
反而在 C 上面對預設的 -O0 參數不會執行任何常數字面的最佳化處理