最早編譯器A0源代碼
① MWC飛控源程序怎麼閱讀
MWC源程序是由arino編寫的,當然用arino看了,你看不明白用別的編譯器也看不明白啊,
代碼中幾個關鍵設置你自己先看看吧:
/**************** The type of multicopter ****************/
#define QUADX //啟用四軸X模式
/**************** Motor minthrottle ****************/
#define MINTHROTTLE 1150 //解鎖後油門怠速 默認1020
/**************** I2C speed ****************/
#define I2C_SPEED 100000L //啟用這個就夠用了
/**************** Combined IMU Boards ****************/
#define FREEIMUv035_BMP //我是3200晶元
/**************** Cam Stabilisation ****************/
#define SERVO_MIX_TILT //啟用雲台
#define SERVO_TILT //啟用雲台
#define TILT_PITCH_MIN 1020 //仰俯舵機最小值,不能低於1020
#define TILT_PITCH_MAX 2000 //仰俯舵機最大值,不能高於2000
#define TILT_PITCH_MIDDLE 1500 //仰俯舵機中立點
#define TILT_PITCH_PROP 10 //仰俯補償角度,如果反向數字前加「-」號
#define TILT_ROLL_MIN 1020 //副翼舵機同上
#define TILT_ROLL_MAX 2000
#define TILT_ROLL_MIDDLE 1500
#define TILT_ROLL_PROP 10
#define CAM_SERVO_HIGH 2000 //快門舵機行程最高
#define CAM_SERVO_LOW 1020 //快門舵機行程最低
#define CAM_TIME_HIGH 1000 // 按下快門時間
#define CAM_TIME_LOW 1000 // 按下快門時間
/**************** Hexa Motor 5 & 6 Pins ****************/
//#define A0_A1_PIN_HEX //四軸不啟用,六軸用
/**************** Aux 2 Pin ****************/
#define RCAUXPIN8 //打開AUX2用於功能控制
//#define RCAUXPIN12 //作用同上,但不能與上面這行同時啟用
/**************** Gyro filters ****************/
#define ITG3200_LPF_42HZ //我是3200晶元
/**************** SECTION 6 - OPTIONAL FEATURES ****************/
#define LEVEL_PDF //穩定模式增強,可以啟用,默認不啟用
/**************** TX-related ****************/
#define DEADBAND 6 //遙控信號誤差,默認值就好
#define ALT_HOLD_THROTTLE_NEUTRAL_ZONE 20 //氣壓定高時有用,忽略油門搖桿輕微動作
/***************** GPS ******************/
#define GPS_SERIAL 2 //啟用埠
#define GPS_BAUD 9600 //我的GPS波特率
#define GPS_LED_INDICATOR //指示燈
/* Get your magnetic decliniation from here : http://magnetic-declination.com/
#define MAG_DECLINIATION 6.34f //當地磁偏角,上面一行有網址
/**************** Buzzer ****************/
#define BUZZER 啟用蜂鳴器
/**************** battery voltage monitoring ****************/
#define VBAT // 啟用電壓報警,要接好電源檢測線
#define VBATSCALE 131
#define VBATLEVEL1_3S 114 // 11.4V時響一聲 4S電池設置請模友補充
#define VBATLEVEL2_3S 111 // 11.1V時響兩聲
#define VBATLEVEL3_3S 99 // 9.9V時響三聲
#define NO_VBAT 16 // Avoid beeping without any battery
/**************** motor, servo and other presets **************/
#define MOTOR_STOP //解鎖後電機不轉
/**************** IMU complimentary filter tuning ****************/
#define ACC_LPF_FACTOR 100 //軟體濾波器,優化感測器數據,減低震動等影響 以下全部啟用
#define MG_LPF_FACTOR 4
#define GYR_CMPF_FACTOR 400.0f
#define GYR_CMPFM_FACTOR 200.0f
② SciTE編譯器背景顏色配置,該怎麼處理
Menu -> Options -> Open User Options File
添加一段類似下面的代碼:
#Default
style.python.32=$(stdstyle.default),back:#333333
# White space: Visible only in View Whitespace mode (or if it has a back colour)
style.python.0=$(stdstyle.whitespace),back:#333333
# Block comment (Lua 5.0)
style.python.1=$(luastyle.blockcomment1),fore:#87CEEB,back:#333333
# Line comment
style.python.2=$(stdstyle.eolcomment1),fore:#87CEEB,back:#333333
# Doc comment -- Not used in Lua (yet )
style.python.3=$(stdstyle.doccomment1),fore:#87CEEB,back:#333333
# Number
style.python.4=$(stdstyle.number1),back:#333333,fore:#FFA0A0
# Keyword
style.python.5=$(stdstyle.keyword1),back:#333333,fore:#F0E68C
# (Double quoted) String
style.python.6=$(stdstyle.string1),back:#333333,fore:#FFA0A0
# Character (Single quoted string)
style.python.7=$(stdstyle.string1),back:#333333,fore:#FFA0A0
# Literal string
style.python.8=$(luastyle.mlstring1),back:#333333,fore:#FFA0A0
# Preprocessor (obsolete in Lua 4.0 and up)
style.python.9=$(stdstyle.preprocessor1),back:#333333,fore:#FFA0A0
# Operators
style.python.10=$(stdstyle.operator1),back:#333333,fore:#FFFFFF
# Identifier (everything else...)
style.python.11=$(stdstyle.default),back:#333333,fore:#FFFFFF
# End of line where string is not closed
style.python.12=$(stdstyle.stringerror)
# Other keywords (bozo test colors, but toned down ;)
style.python.13=$(stdstyle.keyword2),back:#333333,fore:#F0E68C
style.python.14=$(stdstyle.keyword3),back:#333333,fore:#F0E68C
style.python.15=$(stdstyle.keyword4),back:#333333,fore:#F0E68C
style.python.16=$(stdstyle.keyword2),back:#333333,fore:#F0E68C
style.python.17=$(stdstyle.keyword3),back:#333333,fore:#F0E68C
style.python.18=$(stdstyle.keyword4),back:#333333,fore:#F0E68C
style.python.19=$(stdstyle.keyword2),back:#333333,fore:#F0E68C
# Braces are only matched in operator style
braces.lua.style=10
③ 求教編譯器錯誤 800a0400'缺少語句
ActiveServerPages,ASP0126(0x80004005)-->找不到包含文件 (0x80040E21)-->sql語句出錯(數據類型不匹配或表名(欄位名)錯誤或表處於編輯狀態,或表不存在於conn打開的資料庫中) (0x80040E14)-->sql語句出錯(欄位名錯誤,或數據類型不匹配) (0x80040E07)-->sql語句出錯(要插入或更新的欄位的類型與變數數據類型不匹配) (0x80040E57)-->sql語句出錯(要插入或更新的數據溢出) (0x80040E10)-->sql語句出錯(update欄位名或要更新的數據類型錯誤) (0x80004005)-->sql語句出錯(要插入或更新的欄位的數值不能為空值) (0x80004005) -->打開資料庫出錯,沒有在指定目錄發現資料庫 (0x80040E37)-->沒有發現表 MicrosoftVBscript運行時錯誤(0x800A000D)-->錯誤引用rs變數(rs對像已關閉或未定義) MicrosoftVBscript運行時錯誤(0x800A01C2)-->vbscript腳本錯誤(vbscript語句出錯) MicrosoftVBscript運行時錯誤(0x800A0006)-->vbscript腳本錯誤(溢出錯誤) MicrosoftVBscript編譯器錯誤(0x800A040E)-->缺少loop MicrosoftVBscript編譯器錯誤(0x800A03EA)-->缺少if或endif MicrosoftVBscript編譯器錯誤(0x800A03EE)--> 語句未結束(缺少")") MicrosoftVBscript編譯器錯誤(0x800A03F6)-->if語句出錯(缺少endif) MicrosoftVBscript運行時錯誤(0x800A005B)-->缺少set MicrosoftVBscript運行時錯誤(0x800A0005)-->變數未定義 MicrosoftVBscript編譯器錯誤(0x800A03F9)-->if語句缺少then MicrosoftVBscript編譯器錯誤(0x800A0411)-->dim語句定義錯誤 MicrosoftVBscript編譯器錯誤(0x800A0408)-->sql語句錯誤(?????????????????) Microsoft VBScript 運行時錯誤 (0x800A01B6)錯誤原因:set rs=server.create......你少了 set ADODB.Recordset(0x800A0BB9)-->sql語句出錯(sql語句或conn語句未定義或對一個rs屬性進行賦值時發生錯誤) ADODB.Recordset(0x800A0CC1)-->rs對像出錯(rs對像本身不存在或錯誤地引用了一個不存在的欄位名) ADODB.Recordset(0x800A0BCD)-->rs對像出錯(記錄集中沒有記錄卻對記錄集進行操作) ADODB.Recordset(0x800A0E78)-->rs對像出錯(記錄集不存在,缺少rs.open語句) ADODB.Recordset(0x800A0CC1) -->rs對像出錯(引用了一個不存在的欄位名) ADODB.Recordset(0x800A0E7D)-->conn定義錯誤 ADODB.Recordset(0x800A0CB3)-->資料庫以只讀方式打開,無法更新數據 如果 VBScript 語句結構違反了一個或多個 VBScript 腳本語言語法規則,就會產生 VBScript 語法錯誤。 錯誤通常在執行程序前,編譯程序時產生。 以下是53個語法錯誤: 錯誤編號 描述 十進制 十六進制 說明 1001 800A03E9 內存不足 1002 800A03EA 語法錯誤 1003 800A03EB 缺少逗:地 1005 800A03ED 需要 '(' 1006 800A03EE 需要 ')' 1007 800A03EF 缺少逗]地 1010 800A03F2 需要標識符 1011 800A03F3 需要 '=' 1012 800A03F4 需要 'If' 1013 800A03F5 需要 'To' 1014 800A03F6 需要 'End' 1015 800A03F7 需要 'Function' 1016 800A03F8 需要 'Sub' 1017 800A03F9 需要 'Then' 1018 800A03FA 需要 'Wend' 1019 800A03FB 需要 'Loop' 1020 800A03FC 需要 'Next' 1021 800A03FD 需要 'Case' 1022 800A03FE 需要 'Select' 1023 800A03FF 需要表達式 1024 800A0400 需要語句 1025 800A0401 需要語句的結束 1026 800A0402 需要整數常數 1027 800A0403 需要 'While' 或 'Until' 1028 800A0404 需要 'While,'、 'Until,' 或語句未結束 1029 800A0405 需要 'With' 1030 800A0406 標識符太長 1031 800A0407 無效的數 1032 800A0408 無效的字元 1033 800A0409 未結束的串常量 1034 800A040A 未結束的注釋 1037 800A040D 無效使用關鍵字 'Me' 1038 800A040E 'loop' 沒有 'do' 1039 800A040F 無效 'exit' 語句 1040 800A0410 無效 'for' 循環控制變數 1041 800A0411 名稱重定義 1042 800A0412 必須為行的第一個語句 1043 800A0413 不能賦給非Byval參數 1044 800A0414 調用 Sub 時不能使用圓括弧 1045 800A0415 需要文字常數 1046 800A0416 需要 'In' 1047 800A0417 需要 'Class' 1048 800A0418 必須在一個類的內部定義 1049 800A0419 在屬性聲明中需要 Let , Set 或 Get 1050 800A041A 需要 'Property' 1051 800A041B 參數數目必須與屬性說明一致 1052 800A041C 在類中不能有多個預設的屬性/方法 1053 800A041D 類初始化或終止不能帶參數 1054 800A041E Property Let 或 Set 至少應該有一個參數 1055 800A041F 不需要的 'Next' 1056 800A0420 只能在 『Property』 或 』Function』 或 』Sub』 上指定 』Default』 1057 800A0421 說明 'Default' 必須同時說明 'Public' " 1058 800A0422 只能在 Property Get 中指定 'Default' VBScript 運行時錯誤 如果 VBScript 腳本執行系統無法實施的操作,則會產生 VBScript 運行時錯誤。只有在運行腳本、為變數表達式賦值或 分配內存時,才會產生 VBScript 運行時錯誤。 以下是65個運行時錯誤: 錯誤編號 描述 十進制 十六進制 說明 5 800A0005 無效過程調用或參數 6 800A0006 溢出 7 800A0007 內存不足 9 800A0009 下標越界 10 800A000A 該數組為定長的或臨時被鎖定 11 800A000B 被零除 13 800A000D 類型不匹配 14 800A000E 字元串空間溢出 17 800A0011 無法執行請求的操作 28 800A001C 堆棧溢出 35 800A0023 未定義 Sub 或 Function 48 800A0030 載入 DLL 錯誤 51 800A0033 內部錯誤 52 800A0034 壞文件名或數 53 800A0035 文件未找到 54 800A0036 壞文件模式 55 800A0037 文件已經打開 57 800A0039 設備I/O錯誤 58 800A003A 文件已經存在 61 800A003D 磁碟空間已滿 62 800A003E 輸入超出文件尾 67 800A0043 文件太多 68 800A0044 設備不可用 70 800A0046 許可權禁用 71 800A0047 磁碟未准備好 74 800A004A 不能用不同的驅動器重新命名 75 800A004B 路徑/文件訪問錯誤 76 800A004C 路徑未找到 91 800A005B 未設置對象變數 92 800A005C For 循環未初始化 94 800A005E 非法使用 Null 322 800A0142 不能建立所需臨時文件 424 800A01A8 需要對象 429 800A01AD ActiveX 部件無法創建對象 430 800A01AE 類不支持自動化 432 800A01B0 在自動化操作中未找到文件名或類名 438 800A01B6 對象不支持該屬性或方法 440 800A01B8 Automation錯誤 445 800A01BD 對象不支持此操作 446 800A01BE 對象不支持指定的參數 447 800A01BF 對象不支持當前的區域設置 448 800A01C0 未找到命名參數 449 800A01C1 參數不可選 450 800A01C2 錯誤的參數個數或無效的參數屬性值 451 800A01C3 對象不是一個集合 453 800A01C5 指定的dll函數未找到 455 800A01C7 代碼源鎖錯誤 457 800A01C9 這個鍵已經是本集合的一個元素關聯 458 800A01CA 變數使用了一個 VBScript 中不支持的自動化(Automation)類型 462 800A01CE 遠程伺服器不存在或不能訪問 481 800A01E1 無效圖片 500 800A01F4 變數未定義 501 800A01F5 違法的分配 502 800A01F6 腳本對象不安全 503 800A01F7 對象不能安全初始化 504 800A01F8 對象不能安全創建 505 800A01F9 無效的或不合格的引用 506 800A01FA 類未被定義 507 800A01FB 發生異常 5016 800A1398 需要正則表達式對象 5017 800A1399 正則表達式中的語法錯誤 5018 800A139A 錯誤的數量詞 5019 800A139B 在正則表達式中需要 ']' 5020 800A139C 在正則表達式中需要 ')' 5021 800A139D 字元集越界 32811 800A802B 元素未找到
④ 如何查看程序被哪個版本編譯器編譯的linux-gcc
那是不可能的,除非你加入了調試信息,也就是編譯的時候加入了-g參數,然後用gdb調試就可以顯示。最大程度上查看一個elf文件信息。
{
readelf -Wa a.out | head
readelf -wi a.out
readelf -p .comment a.out
objmp -s --section .comment audioplayer
}
如下:
[root@localhost rootfs]# readelf -Wa bin/gzip
復制代碼
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0xa080
Start of program headers: 52 (bytes into file)
Start of section headers: 1975444 (bytes into file)
Flags: 0x5000002, has entry point, Version5 EABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 6
Size of section headers: 40 (bytes)
Number of section headers: 25
Section header string table index: 24
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .note.ABI-tag NOTE 000080f4 0000f4 000020 00 A 0 0 4
[ 2] .init PROGBITS 00008114 000114 00000c 00 AX 0 0 4
[ 3] .text PROGBITS 00008120 000120 17fcfc 00 AX 0 0 16
[ 4] __libc_freeres_fn PROGBITS 00187e1c 17fe1c 000f20 00 AX 0 0 4
[ 5] __libc_thread_fre PROGBITS 00188d3c 180d3c 0000e4 00 AX 0 0 4
[ 6] .fini PROGBITS 00188e20 180e20 000008 00 AX 0 0 4
[ 7] .rodata PROGBITS 00188e28 180e28 058147 00 A 0 0 8
[ 8] __libc_subfreeres PROGBITS 001e0f70 1d8f70 00005c 00 A 0 0 4
[ 9] __libc_atexit PROGBITS 001e0fcc 1d8fcc 000004 00 A 0 0 4
[10] __libc_thread_sub PROGBITS 001e0fd0 1d8fd0 000008 00 A 0 0 4
[11] .ARM.extab PROGBITS 001e0fd8 1d8fd8 001b04 00 A 0 0 4
[12] .ARM.exidx ARM_EXIDX 001e2adc 1daadc 006ea8 00 AL 3 0 4
[13] .tdata PROGBITS 001f1984 1e1984 000018 00 WAT 0 0 4
[14] .tbss NOBITS 001f199c 1e199c 000034 00 WAT 0 0 4
[15] .init_array INIT_ARRAY 001f199c 1e199c 000004 00 WA 0 0 4
[16] .fini_array FINI_ARRAY 001f19a0 1e19a0 000008 00 WA 0 0 4
[17] .jcr PROGBITS 001f19a8 1e19a8 000004 00 WA 0 0 4
[18] .data.rel.ro PROGBITS 001f19ac 1e19ac 00002c 00 WA 0 0 4
[19] .got PROGBITS 001f19d8 1e19d8 00007c 04 WA 0 0 4
[20] .data PROGBITS 001f1a58 1e1a58 0008f7 00 WA 0 0 8
[21] .bss NOBITS 001f2350 1e234f 004828 00 WA 0 0 8
[22] __libc_freeres_pt NOBITS 001f6b78 1e234f 00003c 00 WA 0 0 4
[23] .ARM.attributes ARM_ATTRIBUTES 00000000 1e234f 00002b 00 0 0 1
[24] .shstrtab STRTAB 00000000 1e237a 000118 00 0 0 1
Section to Segment mapping:
Segment Sections...
00 .ARM.exidx
01 .note.ABI-tag .init .text __libc_freeres_fn __libc_thread_freeres_fn .fini .rodata __libc_subfreeres __libc_atexit __libc_thread_subfreeres .ARM.extab .ARM.exidx
02 .tdata .init_array .fini_array .jcr .data.rel.ro .got .data .bss __libc_freeres_ptrs
03 .note.ABI-tag
04 .tdata .tbss
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "5TE"
Tag_CPU_arch: v5TE
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align8_needed: Yes
Tag_ABI_align8_preserved: Yes, except leaf SP
Tag_ABI_enum_size: int
Tag_unknown_44: 1 (0x1)
復制代碼
How to retrieve the GCC version used to compile a given ELF executable? http://stackoverflow.com/questions/2387040/how-to-retrieve-the-gcc-version-used-to-compile-a-given-elf-executable
QUES: I'd like to retrieve the GCC version used to compile a given executable. I tried readelf but didn't get the information. Any thoughts?
ANS: To complete what others have said: it's not stored in the object (or exe) file, unless you compile with debugging information! (option -g). If you compile with debug info, you can get it back with readelf:
復制代碼
[root@localhost test]# gcc a.c
[root@localhost test]# readelf -wi a.out
[root@localhost test]# gcc a.c -g
[root@localhost test]# readelf -wi a.out
The section .debug_info contains:
Compilation Unit @ offset 0x0:
Length: 135
Version: 2
Abbrev Offset: 0
Pointer Size: 8
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
DW_AT_stmt_list : 0
DW_AT_high_pc : 0x400453
DW_AT_low_pc : 0x400448
DW_AT_procer : GNU C 4.1.2 20080704 (Red Hat 4.1.2-55)
DW_AT_language : 1 (ANSI C)
DW_AT_name : a.c
DW_AT_comp_dir : /work/farsight/test
<1><61>: Abbrev Number: 2 (DW_TAG_subprogram)
DW_AT_external : 1
DW_AT_name : main
DW_AT_decl_file : 1
DW_AT_decl_line : 4
DW_AT_prototyped : 1
DW_AT_type : <83>
DW_AT_low_pc : 0x400448
DW_AT_high_pc : 0x400453
DW_AT_frame_base : 0 (location list)
<1><83>: Abbrev Number: 3 (DW_TAG_base_type)
DW_AT_name : int
DW_AT_byte_size : 4
DW_AT_encoding : 5 (signed)
復制代碼
ANS2:
⑤ 現代C/C++編譯器有多智能
最近在搞C/C++代碼的性能優化,發現很多時候自以為的優化其實編譯器早就優化過了,得結合反匯編才能看出到底要做什麼樣的優化。
請熟悉編譯器的同學結合操作系統和硬體談一談現代c/c++編譯器到底有多智能吧。哪些書本上的優化方法其實早就過時了?
以及程序員做什麼會讓編譯器能更好的自動優化代碼?
舉個栗子:
1,循環展開,大部分編譯器設置flag後會自動展開;
2,順序SIMD優化,大部分編譯器設置flag後也會自動優化成SIMD指令;
3,減少中間變數,大部分編譯器會自動優化掉中間變數;
etc.
查看代碼對應的匯編:
Compiler Explorer
【以下解答】
舉個之前看過的例子:
int calc_hash(signed char *s){ static const int N = 100003; int ret = 1; while (*s) { ret = ret * 131 + *s; ++ s; } ret %= N; if (ret < 0) ret += N; //注意這句 return ret;}
【以下解答】
舉個簡單例子,一到一百求和
#include int sum() { int ret= 0; int i; for(i = 1; i <= 100; i++) ret+=i; return ret;}int main() { printf("%d\n", sum()); return 0;}
【以下解答】
話題太大,碼字花時間…
先放傳送門好了。
請看Google的C++編譯器組老大Chandler Carruth的演講。這個演講是從編譯器研發工程師的角度出發,以Clang/LLVM編譯C++為例,向一般C++程序員介紹理解編譯器優化的思維模型。它講解了C++編譯器會做的一些常見優化,而不會深入到LLVM具體是如何實現這些優化的,所以即使不懂編譯原理的C++程序員看這個演講也不會有壓力。
Understanding Compiler Optimization - Chandler Carruth - Opening Keynote Meeting C++ 2015
演示稿:https://meetingcpp.com/tl_files/mcpp/2015/talks/meetingcxx_2015-understanding_compiler_optimization_themed_.pdf
錄像:https://www.youtube.com/watch?v=FnGCDLhaxKU(打不開請自備工具…)
Agner Fog寫的優化手冊也永遠是值得參考的文檔。其中的C++優化手冊:
Optimizing software in C++ - An optimization guide for Windows, Linux and Mac platforms - Agner Fog
要稍微深入一點的話,GCC和LLVM的文檔其實都對各自的內部實現有不錯的介紹。
GCC:GNU Compiler Collection (GCC) Internals
LLVM:LLVM』s Analysis and Transform Passes
========================================
反模式(anti-patterns)
1. 為了「優化」而減少源碼中局部變數的個數
這可能是最沒用的手工「優化」了。特別是遇到在高級語言中「不用臨時變數來交換兩個變數」這種場景的時候。
看另一個問題有感:有什麼像a=a+b;b=a-b;a=a-b;這樣的演算法或者知識? - 編程
2. 為了「優化」而把應該傳值的參數改為傳引用
(待續…)
【以下解答】
推薦讀一讀這里的幾個文檔:
Software optimization resources. C++ and assembly. Windows, Linux, BSD, Mac OS X
其中第一篇:http://www.agner.org/optimize/optimizing_cpp.pdf
講解了C++不同領域的優化思路和問題,還有編譯器做了哪些優化,以及如何代碼配合編譯器優化。還有優化多線程、使用向量指令等的介紹,推薦看看。
感覺比較符合你的部分需求。
【以下解答】
一份比較老的slides:
http://www.fefe.de/source-code-optimization.pdf
【以下解答】
利用C++11的range-based for loop語法可以實現類似python里的range生成器,也就是實現一個range對象,使得
for(auto i : range(start, stop, step))
【以下解答】
我覺得都不用現代。。。。寄存器分配和指令調度最智能了
【以下解答】
每次編譯poco庫的時候我都覺得很為難GCC
【以下解答】
有些智能並不能保證代碼變換前後語義是等價的
【以下解答】
誒誒,我錯了各位,GCC是可以藉助 SSE 的 xmm 寄存器進行優化的,經 @RednaxelaFX 才知道應該添加 -march=native 選項。我以前不了解 -march 選項,去研究下再來補充為什麼加和不加區別這么大。
十分抱歉黑錯了。。。以後再找別的點來黑。
誤導大家了,實在抱歉。(??ˇ?ˇ??)
/*********以下是並不正確的原答案*********/
我是來黑 GCC的。
最近在搞編譯器相關的活,編譯OpenSSL的時候有一段這樣的代碼:
BN_ULONG a0,a1,a2,a3; // EmmetZC 註:BN_ULONG 其實就是 unsigned longa0=B[0]; a1=B[1]; a2=B[2]; a3=B[3];A[0]=a0; A[1]=a1; A[2]=a2; A[3]=a3;
【以下解答】
提示:找不到對象
【以下解答】
忍不住抖個機靈。
私以為正常寫代碼情況下編譯器就能優化,才叫智能編譯器。要程序員絞盡腦汁去考慮怎麼寫代碼能讓編譯器更好優化,甚至降低了可讀性,那就沒有起到透明屏蔽的作用。
智能編譯器應該是程序猿要較勁腦汁才能讓編譯器不優化。
理論上是這樣的。折疊我吧。
【以下解答】
編譯器智能到每次我都覺得自己很智障。
【以下解答】
雖然題主內容里是想問編譯器代碼性能優化方面的內容,但題目里既然說到編譯器的的智能,我就偏一下方向來說吧。
有什麼更能展示編譯器的強大和智能?
自然是c++的模版元編程
template meta programming
簡單解釋的話就是寫代碼的代碼,寫的還是c++,但能讓編譯器在編譯期間生成正常的c++代碼。
沒接觸過的話,是不是聽上去感覺就是宏替換的加強版?感覺不到它的強大呢?
只是簡單用的話,效果上這樣理解也沒什麼
但是一旦深入下去,尤其翻看大神寫的東西,這明明看著就是c++的代碼,但TM怎麼完全看不懂他在干什麼?後來才知道這其實完全是另外一個世界,可是明明是另外一個世界的東西但它又可以用來做很多正常c++能做的事....
什麼?你說它好像不能做這個,不能做那個,好像做不了太多東西,錯了,大錯特錯。就像你和高手考試都考了100分的故事一樣,雖然分數一樣,但你是努力努力再努力才得了滿分,而高手只是因為卷面分只有100分.....在元編程面前,只有想不到,沒有做不到。
再回頭看看其他答案,編譯器順手幫你求個和,丟棄下無用代碼,就已經被驚呼強大了,那模板元編程這種幾乎能在編譯期直接幫你「生成」包含復雜邏輯的c++代碼,甚至還能間接「執行」一些復雜邏輯,這樣的編譯器是不是算怪獸級的強大?
一個編譯器同時支持編譯語法相似但結果不同卻又關聯的兩種依賴語言,這個編譯器有多強大多智能?
寫的人思維都要轉換幾次,編譯器轉著圈嵌著套翻著番兒地編譯代碼的代碼也肯定是無比蛋疼的,你說它有多強大多智能?
一個代碼創造另外一個代碼,自己能按照相似的規則生成自己,是不是聽上去已經有人工智慧的發展趨勢了?
上帝說,要有光,於是有了光。
老子曰,一生二,二生三,三生萬物。
信c++,得永生!
===
FBI WARNING:模板元編程雖然很強大,但也有不少缺點,尤其對於大型項目,為了你以及身邊同事的身心健康,請務必適度且謹慎的使用。勿亂入坑,回頭是岸。
【以下解答】
c++11的auto自動類型推斷算么....
【以下解答】
智能到開不同級別的優化,程序行為會不同 2333
【以下解答】
這個取決於你的水平