最早编译器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
【以下解答】
这个取决于你的水平