1. 程式人生 > >移植中Makefile學習 關鍵字理解

移植中Makefile學習 關鍵字理解

讓我們先看看 Makefile 規則中的編譯命令通常是怎麼寫的。

大多數軟體包遵守如下約定俗成的規範:

#1,首先從原始碼生成目標檔案(預處理,編譯,彙編),"-c"選項表示不執行連結步驟。
$(CC) $(CPPFLAGS) $(CFLAGS) example.c   -c   -o example.o
#2,然後將目標檔案連線為最終的結果(連線),"-o"選項用於指定輸出檔案的名字。
$(CC) $(LDFLAGS) example.o   -o example
#有一些軟體包一次完成四個步驟:
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) example.c   -o example
當然也有少數軟體包不遵守這些約定俗成的規範,比如:
#1,有些在命令列中漏掉應有的Makefile變數(注意:有些遺漏是故意的)
$(CC) $(CFLAGS) example.c    -c   -o example.o
$(CC) $(CPPFLAGS) example.c  -c   -o example.o
$(CC) example.o   -o example
$(CC) example.c   -o example
#2,有些在命令列中增加了不必要的Makefile變數
$(CC) $(CFLAGS) $(LDFLAGS) example.o   -o example
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) example.c   -c   -o example.o
當然還有極個別軟體包完全是"胡來":亂用變數(增加不必要的又漏掉了應有的)者有之,不用$(CC)者有之,不一而足.....

儘管將原始碼編譯為二進位制檔案的四個步驟由不同的程式(cpp,gcc/g++,as,ld)完成,但是事實上 cpp, as, ld 都是由 gcc/g++ 進行間接呼叫的。換句話說,控制了 gcc/g++ 就等於控制了所有四個步驟。從 Makefile 規則中的編譯命令可以看出,編譯工具的行為全靠 CC/CXX CPPFLAGS CFLAGS/CXXFLAGS LDFLAGS 這幾個變數在控制。當然理論上控制編譯工具行為的還應當有 AS ASFLAGS ARFLAGS 等變數,但是實踐中基本上沒有軟體包使用它們。

那麼我們如何控制這些變數呢?一種簡易的做法是首先設定與這些 Makefile 變數同名的環境變數並將它們 export 為全域性,然後執行 configure 指令碼,大多數 configure 指令碼會使用這同名的環境變數代替 Makefile 中的值。但是少數 configure 指令碼並不這樣做(比如GCC-3.4.6和Binutils-2.16.1的指令碼就不傳遞LDFLAGS),你必須手動編輯生成的 Makefile 檔案,在其中尋找這些變數並修改它們的值,許多原始碼包在每個子資料夾中都有 Makefile 檔案,真是一件很累人的事!

CC 與 CXX

這是 C 與 C++ 編譯器命令。預設值一般是 "gcc" 與 "g++"。這個變數本來與優化沒有關係,但是有些人因為擔心軟體包不遵守那些約定俗成的規範,害怕自己苦心設定的 CFLAGS/CXXFLAGS/LDFLAGS 之類的變數被忽略了,而索性將原本應當放置在其它變數中的選項一股老兒塞到 CC 或 CXX 中,比如:CC="gcc -march=k8 -O2 -s"。這是一種怪異的用法,本文不提倡這種做法,而是提倡按照變數本來的含義使用變數。

CPPFLAGS

這是用於預處理階段的選項。不過能夠用於此變數的選項,看不出有哪個與優化相關。如果你實在想設一個,那就使用下面這兩個吧:

-DNDEBUG

"NDEBUG"是一個標準的 ANSI 巨集,表示不進行除錯編譯。

-D_FILE_OFFSET_BITS=64

大多數包使用這個來提供大檔案(>2G)支援。

CFLAGS 與 CXXFLAGS

CFLAGS 表示用於 C 編譯器的選項,CXXFLAGS 表示用於 C++ 編譯器的選項。這兩個變數實際上涵蓋了編譯和彙編兩個步驟。大多數程式和庫在編譯時預設的優化級別是"2"(使用"-O2"選項)並且帶有除錯符號來編譯,也就是 CFLAGS="-O2 -g", CXXFLAGS=$CFLAGS 。事實上,"-O2"已經啟用絕大多數安全的優化選項了。另一方面,由於大部分選項可以同時用於這兩個變數,所以僅在最後講述只能用於其中一個變數的選項。[提醒]下面所列選項皆為非預設選項,你只要按需新增即可。

先說說"-O3"在"-O2"基礎上增加的幾項:

-finline-functions

允許編譯器選擇某些簡單的函式在其被呼叫處展開,比較安全的選項,特別是在CPU二級快取較大時建議使用。

-funswitch-loops

將迴圈體中不改變值的變數移動到迴圈體之外。

-fgcse-after-reload

為了清除多餘的溢位,在過載之後執行一個額外的載入消除步驟。

另外:

-fomit-frame-pointer

對於不需要棧指標的函式就不在暫存器中儲存指標,因此可以忽略儲存和檢索地址的程式碼,同時對許多函式提供一個額外的暫存器。所有"-O"級別都開啟它,但僅在偵錯程式可以不依靠棧指標執行時才有效。在AMD64平臺上此選項預設開啟,但是在x86平臺上則預設關閉。建議顯式的設定它。

-falign-functions=N
-falign-jumps=N
-falign-loops=N
-falign-labels=N

這四個對齊選項在"-O2"中開啟,其中的根據不同的平臺N使用不同的預設值。如果你想指定不同於預設值的N,也可以單獨指定。比如,對於L2-cache>=1M的cpu而言,指定 -falign-functions=64 可能會獲得更好的效能。建議在指定了 -march 的時候不明確指定這裡的值。

除錯選項:

-fprofile-arcs

在使用這一選項編譯程式並執行它以建立包含每個程式碼塊的執行次數的檔案後,程式可以再次使用 -fbranch-probabilities 編譯,檔案中的資訊可以用來優化那些經常選取的分支。如果沒有這些資訊,gcc將猜測哪個分支將被經常執行以進行優化。這類優化資訊將會存放在一個以原始檔為名字的並以".da"為字尾的檔案中。

全域性選項:

-pipe

在編譯過程的不同階段之間使用管道而非臨時檔案進行通訊,可以加快編譯速度。建議使用。

目錄選項:

--sysroot=dir

將dir作為邏輯根目錄。比如編譯器通常會在 /usr/include 和 /usr/lib 中搜索標頭檔案和庫,使用這個選項後將在 dir/usr/include 和 dir/usr/lib 目錄中搜索。如果使用這個選項的同時又使用了 -isysroot 選項,則此選項僅作用於庫檔案的搜尋路徑,而 -isysroot 選項將作用於標頭檔案的搜尋路徑。這個選項與優化無關,但是在 CLFS 中有著神奇的作用。

程式碼生成選項:

-fno-bounds-check

關閉所有對陣列訪問的邊界檢查。該選項將提高陣列索引的效能,但當超出陣列邊界時,可能會造成不可接受的行為。

-freg-struct-return

如果struct和union足夠小就通過暫存器返回,這將提高較小結構的效率。如果不夠小,無法容納在一個暫存器中,將使用記憶體返回。建議僅在完全使用GCC編譯的系統上才使用。

-fpic

生成可用於共享庫的位置獨立程式碼。所有的內部定址均通過全域性偏移表完成。要確定一個地址,需要將程式碼自身的記憶體位置作為表中一項插入。該選項產生可以在共享庫中存放並從中載入的目標模組。

-fstack-check

為防止程式棧溢位而進行必要的檢測,僅在多執行緒環境中執行時才可能需要它。

-fvisibility=hidden

設定預設的ELF映象中符號的可見性為隱藏。使用這個特性可以非常充分的提高連線和載入共享庫的效能,生成更加優化的程式碼,提供近乎完美的API輸出和防止符號碰撞。我們強烈建議你在編譯任何共享庫的時候使用該選項。參見 -fvisibility-inlines-hidden 選項。

硬體體系結構相關選項[僅僅針對x86與x86_64]:

-march=cpu-type

為特定的cpu-type編譯二進位制程式碼(不能在更低級別的cpu上執行)。Intel可以用:pentium2, pentium3(=pentium3m), pentium4(=pentium4m), pentium-m, prescott, nocona, core2(GCC-4.3新增) 。AMD可以用:k6-2(=k6-3), athlon(=athlon-tbird), athlon-xp(=athlon-mp), k8(=opteron=athlon64=athlon-fx)

-mfpmath=sse

P3和athlon-xp級別及以上的cpu支援"sse"標量浮點指令。僅建議在P4和K8以上級別的處理器上使用該選項。

-malign-double

將double, long double, long long對齊於雙位元組邊界上;有助於生成更高速的程式碼,但是程式的尺寸會變大,並且不能與未使用該選項編譯的程式一起工作。

-m128bit-long-double

指定long double為128位,pentium以上的cpu更喜歡這種標準,並且符合x86-64的ABI標準,但是卻不附合i386的ABI標準。

-mregparm=N

指定用於傳遞整數引數的暫存器數目(預設不使用暫存器)。0<=N<=3 ;注意:當N>0時你必須使用同一引數重新構建所有的模組,包括所有的庫。

-msseregparm

使用SSE暫存器傳遞float和double引數和返回值。注意:當你使用了這個選項以後,你必須使用同一引數重新構建所有的模組,包括所有的庫。

-mmmx
-msse
-msse2
-msse3
-m3dnow
-mssse3(沒寫錯!GCC-4.3新增)
-msse4.1(GCC-4.3新增)
-msse4.2(GCC-4.3新增)
-msse4(含4.1和4.2,GCC-4.3新增)

是否使用相應的擴充套件指令集以及內建函式,按照自己的cpu選擇吧!

-maccumulate-outgoing-args

指定在函式引導段中計算輸出引數所需最大空間,這在大部分現代cpu中是較快的方法;缺點是會明顯增加二進位制檔案尺寸。

-mthreads

支援Mingw32的執行緒安全異常處理。對於依賴於執行緒安全異常處理的程式,必須啟用這個選項。使用這個選項時會定義"-D_MT",它將包含使用選項"-lmingwthrd"連線的一個特殊的執行緒輔助庫,用於為每個執行緒清理異常處理資料。

-minline-all-stringops

預設時GCC只將確定目的地會被對齊在至少4位元組邊界的字串操作內聯程序序程式碼。該選項啟用更多的內聯並且增加二進位制檔案的體積,但是可以提升依賴於高速 memcpy, strlen, memset 操作的程式的效能。

-minline-stringops-dynamically

GCC-4.3新增。對未知尺寸字串的小塊操作使用內聯程式碼,而對大塊操作仍然呼叫庫函式,這是比"-minline-all-stringops"更聰明的策略。決定策略的演算法可以通過"-mstringop-strategy"控制。

-momit-leaf-frame-pointer

不為葉子函式在暫存器中儲存棧指標,這樣可以節省暫存器,但是將會使除錯變的困難。注意:不要與 -fomit-frame-pointer 同時使用,因為會造成程式碼效率低下。

-m64

生成專門運行於64位環境的程式碼,不能運行於32位環境,僅用於x86_64[含EMT64]環境。

-mcmodel=small

[預設值]程式和它的符號必須位於2GB以下的地址空間。指標仍然是64位。程式可以靜態連線也可以動態連線。僅用於x86_64[含EMT64]環境。

-mcmodel=kernel

核心運行於2GB地址空間之外。在編譯linux核心時必須使用該選項!僅用於x86_64[含EMT64]環境。

-mcmodel=medium

程式必須位於2GB以下的地址空間,但是它的符號可以位於任何地址空間。程式可以靜態連線也可以動態連線。注意:共享庫不能使用這個選項編譯!僅用於x86_64[含EMT64]環境。

其它優化選項:

-fforce-addr

必須將地址複製到暫存器中才能對他們進行運算。由於所需地址通常在前面已經載入到暫存器中了,所以這個選項可以改進程式碼。

-finline-limit=n

對偽指令數超過n的函式,編譯程式將不進行內聯展開,預設為600。增大此值將增加編譯時間和編譯記憶體用量並且生成的二進位制檔案體積也會變大,此值不宜太大。

-fmerge-all-constants

試圖將跨編譯單元的所有常量值和數組合並在一個副本中。但是標準C/C++要求每個變數都必須有不同的儲存位置,所以該選項可能會導致某些不相容的行為。

-fgcse-sm

在全域性公共子表示式消除之後執行儲存移動,以試圖將儲存移出迴圈。gcc-3.4中曾屬於"-O2"級別的選項。

-fgcse-las

在全域性公共子表示式消除之後消除多餘的在儲存到同一儲存區域之後的載入操作。gcc-3.4中曾屬於"-O2"級別的選項。

-floop-optimize

已廢除(GCC-4.1曾包含在"-O1"中)。

-floop-optimize2

使用改進版本的迴圈優化器代替原來"-floop-optimize"。該優化器將使用不同的選項(-funroll-loops, -fpeel-loops, -funswitch-loops, -ftree-loop-im)分別控制迴圈優化的不同方面。目前這個新版本的優化器尚在開發中,並且生成的程式碼質量並不比以前的版本高。已廢除,僅存在於GCC-4.1之前的版本中。

-funsafe-loop-optimizations

假定迴圈不會溢位,並且迴圈的退出條件不是無窮。這將可以在一個比較廣的範圍內進行迴圈優化,即使優化器自己也不能斷定這樣做是否正確。

-fsched-spec-load

允許一些裝載指令執行一些投機性的動作。

-ftree-loop-linear

在trees上進行線型迴圈轉換。它能夠改進緩衝效能並且允許進行更進一步的迴圈優化。

-fivopts

在trees上執行歸納變數優化。

-ftree-vectorize

在trees上執行迴圈向量化。

-ftracer

執行尾部複製以擴大超級塊的尺寸,它簡化了函式控制流,從而允許其它的優化措施做的更好。據說挺有效。

-funroll-loops

僅對迴圈次數能夠在編譯時或執行時確定的迴圈進行展開,生成的程式碼尺寸將變大,執行速度可能變快也可能變慢。

-fprefetch-loop-arrays

生成陣列預讀取指令,對於使用巨大陣列的程式可以加快程式碼執行速度,適合資料庫相關的大型軟體等。具體效果如何取決於程式碼。

-fweb

建立經常使用的快取器網路,提供更佳的快取器使用率。gcc-3.4中曾屬於"-O3"級別的選項。

-ffast-math

違反IEEE/ANSI標準以提高浮點數計算速度,是個危險的選項,僅在編譯不需要嚴格遵守IEEE規範且浮點計算密集的程式考慮採用。

-fsingle-precision-constant

將浮點常量作為單精度常量對待,而不是隱式地將其轉換為雙精度。

-fbranch-probabilities

在使用 -fprofile-arcs 選項編譯程式並執行它來建立包含每個程式碼塊執行次數的檔案之後,程式可以利用這一選項再次編譯,檔案中所產生的資訊將被用來優化那些經常發生的分支程式碼。如果沒有這些資訊,gcc將猜測那一分支可能經常發生並進行優化。這類優化資訊將會存放在一個以原始檔為名字的並以".da"為字尾的檔案中。

-frename-registers

試圖驅除程式碼中的假依賴關係,這個選項對具有大量暫存器的機器很有效。gcc-3.4中曾屬於"-O3"級別的選項。

-fbranch-target-load-optimize
-fbranch-target-load-optimize2

在執行序啟動以及結尾之前執行分支目標快取器載入最佳化。

-fstack-protector

在關鍵函式的堆疊中設定保護值。在返回地址和返回值之前,都將驗證這個保護值。如果出現了緩衝區溢位,保護值不再匹配,程式就會退出。程式每次執行,保護值都是隨機的,因此不會被遠端猜出。

-fstack-protector-all

同上,但是在所有函式的堆疊中設定保護值。

--param max-gcse-memory=xxM

執行GCSE優化使用的最大記憶體量(xxM),太小將使該優化無法進行,預設為50M。

--param max-gcse-passes=n

執行GCSE優化的最大迭代次數,預設為 1。

傳遞給彙編器的選項:

-Wa,options

options是一個或多個由逗號分隔的可以傳遞給彙編器的選項列表。其中的每一個均可作為命令列選項傳遞給彙編器。

-Wa,--strip-local-absolute

從輸出符號表中移除區域性絕對符號。

-Wa,-R

合併資料段和正文段,因為不必在資料段和程式碼段之間轉移,所以它可能會產生更短的地址移動。

-Wa,--64

設定字長為64bit,僅用於x86_64,並且僅對ELF格式的目標檔案有效。此外,還需要使用"--enable-64-bit-bfd"選項編譯的BFD支援。

-Wa,-march=CPU

按照特定的CPU進行優化:pentiumiii, pentium4, prescott, nocona, core, core2; athlon, sledgehammer, opteron, k8 。

僅可用於 CFLAGS 的選項:

-fhosted

按宿主環境編譯,其中需要有完整的標準庫,入口必須是main()函式且具有int型的返回值。核心以外幾乎所有的程式都是如此。該選項隱含設定了 -fbuiltin,且與 -fno-freestanding 等價。

-ffreestanding

按獨立環境編譯,該環境可以沒有標準庫,且對main()函式沒有要求。最典型的例子就是作業系統核心。該選項隱含設定了 -fno-builtin,且與 -fno-hosted 等價。

僅可用於 CXXFLAGS 的選項:

-fno-enforce-eh-specs

C++標準要求強制檢查異常違例,但是該選項可以關閉違例檢查,從而減小生成程式碼的體積。該選項類似於定義了"NDEBUG"巨集。

-fno-rtti

如果沒有使用'dynamic_cast'和'typeid',可以使用這個選項禁止為包含虛方法的類生成執行時表示程式碼,從而節約空間。此選項對於異常處理無效(仍然按需生成rtti程式碼)。

-ftemplate-depth-n

將最大模版例項化深度設為'n',符合標準的程式不能超過17,預設值為500。

-fno-optional-diags

禁止輸出診斷訊息,C++標準並不需要這些訊息。

-fno-threadsafe-statics

GCC自動在訪問C++區域性靜態變數的程式碼上加鎖,以保證執行緒安全。如果你不需要執行緒安全,可以使用這個選項。

-fvisibility-inlines-hidden

預設隱藏所有行內函數,從而減小匯出符號表的大小,既能縮減檔案的大小,還能提高執行效能,我們強烈建議你在編譯任何共享庫的時候使用該選項。參見 -fvisibility=hidden 選項。

LDFLAGS

LDFLAGS 是傳遞給聯結器的選項。這是一個常被忽視的變數,事實上它對優化的影響也是很明顯的。

[提示]以下選項是在完整的閱讀了ld-2.18文件之後挑選出來的選項。http://blog.chinaunix.net/u1/41220/showart_354602.html 有2.14版本的中文手冊。

-s

刪除可執行程式中的所有符號表和所有重定位資訊。其結果與執行命令 strip 所達到的效果相同,這個選項是比較安全的。

-Wl,options

options是由一個或多個逗號分隔的傳遞給連結器的選項列表。其中的每一個選項均會作為命令列選項提供給連結器。

-Wl,-On

當n>0時將會優化輸出,但是會明顯增加連線操作的時間,這個選項是比較安全的。

-Wl,--exclude-libs=ALL

不自動匯出庫中的符號,也就是預設將庫中的符號隱藏。

-Wl,-m<emulation>

模擬<emulation>聯結器,當前ld所有可用的模擬可以通過"ld -V"命令獲取。預設值取決於ld的編譯時配置。

-Wl,--sort-common

把全域性公共符號按照大小排序後放到適當的輸出節,以防止符號間因為排布限制而出現間隙。

-Wl,-x

刪除所有的本地符號。

-Wl,-X

刪除所有的臨時本地符號。對於大多數目標平臺,就是所有的名字以'L'開頭的本地符號。

-Wl,-zcomberloc

組合多個重定位節並重新排布它們,以便讓動態符號可以被快取。

-Wl,--enable-new-dtags

在ELF中建立新式的"dynamic tags",但在老式的ELF系統上無法識別。

-Wl,--as-needed

移除不必要的符號引用,僅在實際需要的時候才連線,可以生成更高效的程式碼。

-Wl,--no-define-common

限制對普通符號的地址分配。該選項允許那些從共享庫中引用的普通符號只在主程式中被分配地址。這會消除在共享庫中的無用的副本的空間,同時也防止了在有多個指定了搜尋路徑的動態模組在進行執行時符號解析時引起的混亂。

-Wl,--hash-style=gnu

使用gnu風格的符號散列表格式。它的動態連結效能比傳統的sysv風格(預設)有較大提升,但是它生成的可執行程式和庫與舊的Glibc以及動態連結器不相容。

最後說兩個與優化無關的系統環境變數,因為會影響GCC編譯程式的方式,下面兩個是咱中國人比較關心的:

LANG

指定編譯程式使用的字符集,可用於建立寬字元檔案、串文字、註釋;預設為英文。[目前只支援日文"C-JIS,C-SJIS,C-EUCJP",不支援中文]

LC_ALL

指定多位元組字元的字元分類,主要用於確定字串的字元邊界以及編譯程式使用何種語言發出診斷訊息;預設設定與LANG相同。中文相關的幾項:"zh_CN.GB2312 , zh_CN.GB18030 , zh_CN.GBK , zh_CN.UTF-8 , zh_TW.BIG5"。

相關推薦

移植Makefile學習 關鍵字理解

讓我們先看看 Makefile 規則中的編譯命令通常是怎麼寫的。 大多數軟體包遵守如下約定俗成的規範: #1,首先從原始碼生成目標檔案(預處理,編譯,彙編),"-c"選項表示不執行連結步驟。 $(CC) $(CPPFLAGS) $(CFLAGS) example.c -c -o example.o

java的static關鍵字學習,靜態成員記憶體理解,靜態常量應用,靜態修飾成員在多型呼叫的問題

一、static的啟用原因 1、假設一個Student類,包含三個屬性,姓名,年齡,學校。姓名,年齡不同,但是學校都相同,當例項化這個類時都會對這三個屬性賦初值。由於學校都相同,new的次數越多,就會形成了巨大的浪費。 為了杜絕這種浪費,設定了一個共享資料方法,即static關鍵字

機器學習的回歸理解

機器學習中的線性模型理解機器學習中的類別均衡問題?分為類別平衡問題和類別不平衡問題類別平衡問題:可以采用回歸類別不平衡問題:可以采用在縮放針對類別的回歸問題有線性回歸:非線性回本文出自 “簡答生活” 博客,謝絕轉載!機器學習中的回歸理解

Javasynchronized關鍵字理解

監視器 pre 定義 exc 執行 zed 三種 gen 好記性不如爛筆頭 好記性不如爛筆頭~~ 並發編程中synchronized關鍵字的地位很重要,很多人都稱它為重量級鎖。利用synchronized實現同步的基礎:Java中每一個對象都可以作為鎖。具體表現為以下三種形

JDK學習---深入理解java的String

test bound test6 -h 很多 lai 靈活性 圖形 會有 本文參考資料: 1、《深入理解jvm虛擬機》 2、《大話數據結構》、《大化設計模式》 3、http://www.cnblogs.com/ITtangtang/p/3976820.html#344102

java容器的學習理解

優化 是我 move 查找 map 常常 ise 線性 arr   以前一直對於java中容器的概念不理解,雖然學習過,但始終沒有認真理解過,這幾天老師提出了這樣一個問題,你怎麽理解java中的容器。瞬間就蒙了。於是各種搜資料學習了一下,下面是我學習後整理出來的的一些心得。

【知了堂學習筆記】java常用集合的理解

style out hset 篩選 arraylist list 內容 必備 foreach   最近學習了java中常用集合類的一些知識,在這裏作為一只小白,我來談談我的理解,順帶總結知識點。 引入:在沒有接觸之前,聽到集合,給我感覺是想到了數學中的集合一樣,裏面存放著一

深入理解Java的volatile關鍵字

語言 重新 為什麽 設置 模型 可見性 會有 普通 enter 在再有人問你Java內存模型是什麽,就把這篇文章發給他中我們曾經介紹過,Java語言為了解決並發編程中存在的原子性、可見性和有序性問題,提供了一系列和並發處理相關的關鍵字,比如synchronized、vola

Makefile學習(一)----初步理解

一.我對makefile的理解: 經過一段時間對makefile的學習,我理解的makefile就是將程式設計師手動編譯原始檔的過程用一個指令碼執行,這對於小型專案來說,程式設計師手動執行和用makefile來執行感官上可能沒有大的差異,但是對於中大型專案來說,makefile的存在大大提供了程式設計師編譯

完全理解JavaScript的this關鍵字

前言 原文 王福朋老師的 JavaScript原型和閉包系列 文章看了不下三遍了,最為一個初學者,每次看的時候都會有一種 "大徹大悟" 的感覺,而看完之後卻總是一臉懵逼。原型與閉包 可以說是 JavaScirpt 中理解起來最難的部分了,當然,我也只是瞭解到了一些皮毛,對於 JavaScript OOP

Java程式設計思想學習(一)----物件導論多型的理解

1.1抽象過程 1)萬物皆物件。 2)程式是物件的集合,他們通過傳送訊息來告知彼此所要求做的。 3)每個物件都有自己的由其他物件所構成的儲存。 4)每個物件都擁有其型別。 5)某一特定型別的所有物件都可以接收同樣的訊息。 上面是書上總結的內容,具體程式碼如下: //每個物件都有一個介面,介

php對static關鍵字理解

/** * static 關鍵字 * 1. 定義與訪問類靜態成員 * 2. 訪問類常量 * 2. 後期靜態繫結(延遲靜態繫結) */ class MyClass{ //const 定義類常量 const DOMAIN = 'DonnieKing'; //st

機器學習的超平面理解(SVM開篇之超平面詳解)

目錄 一、什麼是超平面 二、點到超平面的距離  三、 判斷超平面的正反 一、什麼是超平面 以上是三維為例子。  通過查閱資料對超平面有了一定的認識, n 維空間中的超平面由下面的方程確定:  其中,w&nb

Java的final關鍵字學習(一)

final關鍵字 1.修飾類,類無法被繼承 但是要注意被final修飾類中的所有成員方法都會被隱式地指定為final方法 2.修飾方法,此方法就無法被重寫 注:類的private方法會隱式地被指定為final方法 3.修飾變數  變數就成了常量,只能被賦值一次

記錄自己的學習歷程--自己對於JSPpageContext物件的理解

關於pageContex--頁面上下文物件自己的理解,只是作為新手學習很淺顯的認識,如有誤,請大牛指出,或者請告訴我更深的理解,感激不盡! 新建jsp1和jsp2,目錄結構如下:       在jsp1頁面中新增一個超連結<a href="js

理解javascript的this關鍵字

一直以來,this關鍵字都是我的知識盲區,雖然平時一直都有用到,但是都不是很理解this的指向,今天看了一篇文章,感覺受益匪淺,所以做個記錄。參考文章地址https://www.jb51.net/article/74097.htm 1.首先確定它是不是用new進行呼

探究Java的final關鍵字--------Java的系列學習之路(12)

前言---- 國慶回家悠閒了七天,沒帶電腦,今天是軍訓的第一天(大三才入學軍訓,沒誰了),今晚趁教官去本部看匯演免訓一晚上,不過坑還是要補的,就出門奔教室了。歡迎轉載,轉載請註明來處 1.final用來修飾類,方法,變數 a.修飾類 我們用final修飾類,表明這

影象學習的梯度如何理解

影象的梯度就是去掉背景加重輪廓。 x軸方向的梯度主要顯示垂直方向的線條,也就是加深垂直方向的輪廓線條 y軸方向的梯度主要顯示水平方向的線條,也就是加深水平方向的輪廓線條 canny的邊緣檢測 第一:消除噪聲,用高斯濾波器來平滑影象,消除噪聲。 邊緣檢測的結果都容易收到噪聲的干擾,因此在

機器學習的熵的理解

機器學習中的熵的理解 ​ 熵的概念最早起源於物理學,用於度量一個熱力學系統的無序程度,在資訊理論裡,熵是相對不確定的測量,熵越高,則能傳輸的資訊就越多,熵越低,則能傳遞的資訊就越低。 資訊熵 ​ 熵 (entropy) 這一詞最初來源於熱力學。1948年,克勞德·愛爾伍德·夏農將

unity協程的理解學習

先放二篇大神寫的部落格,很受用。謝謝https://blog.csdn.net/huang9012/article/details/38492937 http://www.unity.5helpyou.com/2658.html 今天在看Unity中協程的作用先放一個物體漸隱漸現的效果吧