精华内容
下载资源
问答
  • mui选项

    千次阅读 2018-09-28 18:56:27
    【HTML文件】,然后在弹出窗口下面的“选择模板组:”中选中“mui底部选项卡(Webview模式)”。点击完成,就会自动创建一个带有默认页面的模板。 打开tab-webview-main.html可以在右侧看到已经创建了一个有底部...

    极速创建

    【文件】->【新建】->【HTML文件】,然后在弹出窗口下面的“选择模板组:”中选中“mui底部选项卡(Webview模式)”。点击完成,就会自动创建一个带有默认页面的模板。
    这里写图片描述
    打开tab-webview-main.html可以在右侧看到已经创建了一个有底部选项卡的主页面。再浏览其它页面可以看到各个页面的内容。但是在右侧的web浏览器中点击选项卡的话,只是顶部标题文字变了,内容是空白的,这时候看到控制台中的错误信息:

    [Web浏览器] “Uncaught ReferenceError: plus is not defined (提示: plus api只能在手机app里运行)”

    真机调试

    也就是说想看到点击效果,必须在安卓设备上运行。Hbuilder中可以支持真机调试,用自己的手机开启调试,然后连接到电脑后(要各种助手软件能检测到)可以在菜单栏的【运行】->【手机运行】下看到连接到的手机。直接点击就可以运行了。

    如果手机连接很麻烦,这时候可以用安卓模拟器进行调试,我调试用的是天天模拟器,打开模拟器之后,控制台输入adb connect 127.0.0.1:6555,然后等待约5秒就可以在菜单中找到安卓模拟器了。这里的6555是天天模拟器的端口,详细关于安卓模拟器调试,请看我的另一篇文章:http://blog.csdn.net/anjingshen/article/details/74085075

    一切就绪后,点击【在XX设备上运行my项目】,就可以在安卓上看到启动了一个Hbuilder的程序,但是出来的是hello world,并不是带选项卡的首页,可以在manifest.json中设置【页面入口】选项,设置为tab-webview-main.html,保存,在此启动app就可以看到效果了。

    点击各个选项卡,初次加载是fade-in淡入动画,再次加载就直接显示了。

    页面分析

    会到Hbuilder,查看新增加的五个文件。可以看到,选项卡在tab-webview-main.html文件中,其他各个页面内容不同,共用这个选项卡。拿首页(about)页面来说,实际上是把由tab-webview-main.html和tab-webview-subpage-about.html组合而成的。

    这里其使用到的是mui中的子页面技术。父页面tab-webview-main.html,其他几个页面可以通过父页面切换。

    考虑到性能和效果等因素,如果希望把一个页面拆分成两个或多个页面的话,就应该使用子页面。

    为方便起见,我们把这些文件重命名,tab-webview-main.html改成main.html,其他几个去掉tab-webview-subpage-前缀。

    打开main.html文件,看到html部分就是一个header和底部选项卡nav标签。

    再看js部分。第一行是调用mui的init初始化页面:

    mui.init();
    1
    

    这里在每个页面都必须调用一次,主要是mui的绑定事件等初始化工作。

    var subpages = ['tab-webview-subpage-about.html', 'tab-webview-subpage-chat.html', 'tab-webview-subpage-contact.html', 'tab-webview-subpage-setting.html'];
    1
    

    这里把所有子页面的地址保存起来了,由于改变了文件名,这里也要做相应改变。

    var subpages = ['about.html', 'chat.html', 'contact.html', 'setting.html'];
    1
    

    接下来定义的subpage_style是子页面的样式,在后面用到的,这里先不用管。

    //创建子页面,首个选项卡页面显示,其它均隐藏;
    mui.plusReady(function() {
        var self = plus.webview.currentWebview();
        for (var i = 0; i < 4; i++) {
            var temp = {};
            var sub = plus.webview.create(subpages[i], subpages[i], subpage_style);
            if (i > 0) {//不是第一个就隐藏
                sub.hide();
            }else{//第一个不隐藏,并且在标志数组中记录下来。
                temp[subpages[i]] = "true";
                mui.extend(aniShow,temp);
            }
            self.append(sub);//加入子页面
        }
    });
    123456789101112131415
    

    上面是调用了mui的plusReady函数,并传递了一个回调函数。
    在app开发中,若要使用HTML5+扩展api,比如打开新页面openWindow,显示遮罩层showWaiting等,必须等plusready事件发生后才能正常使用,mui将该事件封装成了mui.plusReady()方法,涉及到HTML5+的api,建议都写在mui.plusReady方法中。关于事件的详细内容,看这里:http://www.html5plus.org/doc/zh_cn/events.html

    回到上面的代码,里面的回调函数会在页面初始化完后执行。看下函数里面,第一行是得到当前页面对象(WebviewObject)。

    跟plus.webview.currentWebview统一层的还有create, show, open, hide, close, showWaiting, closeWaiting 等界面相关的操作。

    上面我们说道,main是主页面,其他四个是它的子页面,添加子页面有两种方式,一种是调用webview对象的append方法,另一种是在init函数中传入配置项,详见:http://dev.dcloud.net.cn/mui/window/#subpage

    这里采用的是第一种方法append。先遍历subpages数组,显示第一个,隐藏其他几个,这里谁隐藏了,谁没有隐藏,还需要aniShow这个字典记录,显示的就把响应的键置为"true"

    这时候页面就会默认显示about.html页面,但是点击选项卡并不会切换,因为没有为他们监听事件。

    //选项卡点击事件
    mui('.mui-bar-tab').on('tap', 'a', function(e) {
        var targetTab = this.getAttribute('href');
        if (targetTab == activeTab) {
            return;
        }
        //更换标题
        title.innerHTML = this.querySelector('.mui-tab-label').innerHTML;
        //显示目标选项卡
        //若为iOS平台或非首次显示,则直接显示
        if(mui.os.ios||aniShow[targetTab]){
            plus.webview.show(targetTab);
        }else{
            //否则,使用fade-in动画,且保存变量
            var temp = {};
            temp[targetTab] = "true";
            mui.extend(aniShow,temp);
            plus.webview.show(targetTab,"fade-in",300);
        }
        //隐藏当前;
        plus.webview.hide(activeTab);
        //更改当前活跃的选项卡
        activeTab = targetTab;
    });
    123456789101112131415161718192021222324
    

    事件监听可以用原生JavaScript,也可以用jquery,但是官方不推荐jquery,太重量级了,对app性能是一个巨大损耗。

    这里可以为每个tab设置id,然后分别写监听,不过显然比较麻烦。也可以用document.querySelector(‘.mui-bar-tab a’).addEventListener监听,不过用官方包装后的mui(‘.mui-bar-tab’).on函数显然更方便,on函数三个参数分别是【事件名称】,【子元素】,【绑定函数】。

    注意:这里的事件名是tap而不是click,因为click事件有默认300ms延迟。

    这里通过href属性获取子页面url。【href属性也需要改文件名】,然后判断点击的页面和当前显示的页面是否相同,如果相同就直接退出,这里不判断的话,会出现点击两次白屏的效果。

    然后更新标题,判断是否已经显示过了,如果显示过aniShow[url]'true',页面已经加载过,可以直接显示,不需要过渡动画。如果页面没有显示过,通过plus.webview.show 方法显示,这里的"fade-in",参数表示用淡入动画。【注意:子页面只支持淡入动画】,其他如”slide-in-right”都无效,会有闪屏现象,体验很差。

    然后是将上一个webview隐藏,记录当前webview的url。

     //自定义事件,模拟点击“首页选项卡”
    document.addEventListener('gohome', function() {
        var defaultTab = document.getElementById("defaultTab");
        //模拟首页点击
        mui.trigger(defaultTab, 'tap');
        //切换选项卡高亮
        var current = document.querySelector(".mui-bar-tab>.mui-tab-item.mui-active");
        if (defaultTab !== current) {
            current.classList.remove('mui-active');
            defaultTab.classList.add('mui-active');
        }
    });
    123456789101112
    

    最后是一个自定义页面事件,干什么用呢?如果其他页面想直接返回首页怎么办?找到main对应的webview然后show显示,显示的不一定是首页啊,因为activeTab有可能是通讯录、设置、消息。找到about的webview然后show嘛?更不行啊,这样就没选项卡了。所以这就涉及到页面间传值了。关于这部分可以看这篇文章:http://dev.dcloud.net.cn/mui/event/#customevent

    --------------------- 本文来自 景影随形 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/anjingshen/article/details/74138717?utm_source=copy

    展开全文
  • Mac 下隐藏显示文件夹的快捷键

    千次阅读 2017-05-03 15:16:47
    Mac 下隐藏显示文件夹的快捷键




    Command+Shift+. 可以显示隐藏文件、文件夹,再按一次,恢复隐藏;
    finder下使用Command+Shift+G 可以前往任何文件夹,包括隐藏文件夹。



    原来的:

    Command+Shift+. 可以显示隐藏文件、文件夹,再按一次,恢复隐藏;
    finder下使用Command+Shift+G 可以前往任何文件夹,包括隐藏文件夹。


    不好用了,不知为什么.



    以上从  https://www.zhihu.com/question/24635640/answer/127004307  粘来的,

    因为我试了一下,确认了哪个好使,哪个不好使,这就变我的了,也算有劳动吧,别挑眼哈.


    今儿个就跟快捷键干上了,再贴一个 Android Studio 上的快捷键贴子,里面的都是 Windows 下的,在 Mac 下 Ctrl 不好使的 就换成 Alt 

    http://blog.csdn.net/altair86/article/details/8972178/

    此链接内容也转一下吧,等我的联想大破本子修回来了,再对比苹果和Win10,逐一合对,快捷键确实提高生产效率,使你的想法随时兑现.


    Alt+回车 导入包,自动修正
    Ctrl+N   查找类
    Ctrl+Shift+N 查找文件
    Ctrl+Alt+L  格式化代码
    Ctrl+Alt+O 优化导入的类和包
    Alt+Insert 生成代码(如get,set方法,构造函数等)
    Ctrl+E或者Alt+Shift+C  最近更改的代码
    Ctrl+R 替换文本
    Ctrl+F 查找文本
    Ctrl+Shift+Space 自动补全代码
    Ctrl+空格 代码提示
    Ctrl+Alt+Space 类名或接口名提示
    Ctrl+P 方法参数提示
    Ctrl+Shift+Alt+N 查找类中的方法或变量
    Alt+Shift+C 对比最近修改的代码

    Shift+F6  重构-重命名
    Ctrl+Shift+先上键
    Ctrl+Y删除行ctrl+x不是删除行,是剪切。如果不选中,则为剪切当行。ths for 貌似掉线
    Ctrl+D 复制行
    Ctrl+/ 或 Ctrl+Shift+/  注释(// 或者/*...*/ )
    Ctrl+J  自动代码
    Ctrl+E 最近打开的文件
    Ctrl+H 显示类结构图
    Ctrl+Q 显示注释文档
    Alt+F1 查找代码所在位置
    Alt+1 快速打开或隐藏工程面板
    Ctrl+Alt+ left/right 返回至上次浏览的位置
    Alt+ left/right 切换代码视图
    Alt+ Up/Down 在方法间快速移动定位
    Ctrl+Shift+Up/Down 代码向上/下移动。
    F2 或Shift+F2 高亮错误或警告快速定位

    代码标签输入完成后,按Tab,生成代码。
    选中文本,按Ctrl+Shift+F7 ,高亮显示所有该文本,按Esc高亮消失。
    Ctrl+W 选中代码,连续按会有其他效果
    选中文本,按Alt+F3 ,逐个往下查找相同文本,并高亮显示。
    Ctrl+Up/Down 光标跳转到第一行或最后一行下
    Ctrl+B 快速打开光标处的类或方法 
    最常用快捷键
    1.Ctrl+E,可以显示最近编辑的文件列表
    2.Shift+Click可以关闭文件
    3.Ctrl+[或]可以跳到大括号的开头结尾
    4.Ctrl+Shift+Backspace可以跳转到上次编辑的地方
    5.Ctrl+F12,可以显示当前文件的结构
    6.Ctrl+F7可以查询当前元素在当前文件中的引用,然后按F3可以选择
    7.Ctrl+N,可以快速打开类
    8.Ctrl+Shift+N,可以快速打开文件
    9.Alt+Q可以看到当前方法的声明
    10.Ctrl+W可以选择单词继而语句继而行继而函数
    11.Alt+F1可以将正在编辑的元素在各个面板中定位
    12.Ctrl+P,可以显示参数信息
    13.Ctrl+Shift+Insert可以选择剪贴板内容并插入
    14.Alt+Insert可以生成构造器/Getter/Setter等
    15.Ctrl+Alt+V 可以引入变量。例如把括号内的SQL赋成一个变量
    16.Ctrl+Alt+T可以把代码包在一块内,例如try/catch
    17.Alt+Up and Alt+Down可在方法间快速移动
    下面的不是很有用
    18.在一些地方按Alt+Enter可以得到一些Intention Action,例如将”==”改为”equals()”
    19.Ctrl+Shift+Alt+N可以快速打开符号
    20.Ctrl+Shift+Space在很多时候都能够给出Smart提示
    21.Alt+F3可以快速寻找
    22.Ctrl+/和Ctrl+Shift+/可以注释代码
    23.Ctrl+Alt+B可以跳转到抽象方法的实现
    24.Ctrl+O可以选择父类的方法进行重写
    25.Ctrl+Q可以看JavaDoc
    26.Ctrl+Alt+Space是类名自动完成
    27.快速打开类/文件/符号时,可以使用通配符,也可以使用缩写
    28.Live Templates! Ctrl+J
    29.Ctrl+Shift+F7可以高亮当前元素在当前文件中的使用
    30.Ctrl+Alt+Up /Ctrl+Alt+Down可以快速跳转搜索结果
    31.Ctrl+Shift+J可以整合两行
    32.Alt+F8是计算变量值

    IntelliJ IDEA使用技巧一览表 
    在使用 InelliJ IDEA 的过程中,通过查找资料以及一些自己的摸索,发现这个众多 Java 程序员喜欢的 IDE 里有许多值得一提的小窍门,如果能熟练的将它们应用于实际开发过程中,相信它会大大节省你的开发时间,而且随之而来的还会有那么一点点成就感:) Try it ! 

    1 、写代码时用 Alt-Insert ( Code|Generate… )可以创建类里面任何字段的 getter 与 setter 方法。 
    <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> 

    2 、右键点击断点标记(在文本的左边栏里)激活速查菜单,你可以快速设置 enable/disable 断点或者条件它的属性。

    3 、 CodeCompletion (代码完成)属性里的一个特殊的变量是,激活 Ctrl-Alt-Space 可以完成在或不在当前文件里的类名。如果类没有引入则 import 标志会自动创建。

    4 、使用 Ctrl-Shift-V 快捷键可以将最近使用的剪贴板内容选择插入到文本。使用时系统会弹出一个含有剪贴内容的对话框,从中你可以选择你要粘贴的部分。 



    5 、利用 CodeCompletion (代码完成)属性可以快速地在代码中完成各种不同地语句,方法是先键入一个类名地前几个字母然后再用 Ctrl-Space 完成全称。如果有多个选项,它们会列在速查列表里。 



    6 、用 Ctrl-/ 与 Ctrl-Shift-/ 来注释 / 反注释代码行与代码块。 

    -/ 用单行注释标记(“ //… ”)来注释 / 反注释当前行或者选择地代码块。而 Ctrl-Shift-/ 则可以用块注释标记(“ /*…*/ ”)把所选块包围起来。要反注释一个代码块就在块中任何一个地方按 Ctrl-Shift-/ 即可。



    7 、按 Alt-Q ( View|Context Info )可以不需要移动代码就能查看当前方法地声明。连续按两次会显示当前所编辑的类名。 



    8 、使用 Refactor|Copy Class… 可以创建一个所选择的类的“副本”。这一点很有用,比如,在你想要创建一个大部分内容都和已存在类相同的类时。 



    9 、在编辑器里 Ctrl-D 可以复制选择的块或者没有所选块是的当前行。 



    10 、 Ctrl-W (选择字)在编辑器里的功能是先选择脱字符处的单词,然后选择源代码的扩展区域。举例来说,先选择一个方法名,然后是调用这个方法的表达式,然后是整个语句,然后包容块,等等。



    11 、如果你不想让指示事件细节的“亮球”图标在编辑器上显示,通过按 Alt-Enter 组合键打开所有事件列表然后用鼠标点击它就可以把这个事件文本附件的亮球置成非活动状态。 

    这样以后就不会有指示特殊事件的亮球出现了,但是你仍然可以用 Alt-Enter 快捷键使用它。



    12 、在使用 CodeCompletion 时,可以用逗点( . )字符,逗号(,)分号(;),空格和其它字符输入弹出列表里的当前高亮部分。选择的名字会随着输入的字符自动输入到编辑器里。 



    13 、在任何工具窗口里使用 Escape 键都可以把焦点移到编辑器上。 

    Shift-Escape 不仅可以把焦点移到编辑器上而且还可以隐藏当前(或最后活动的)工具窗口。 

    F12 键把焦点从编辑器移到最近使用的工具窗口。 



    14 、在调试程序时查看任何表达式值的一个容易的方法就是在编辑器中选择文本(可以按几次 Ctrl-W 组合键更有效地执行这个操作)然后按 Alt-F8 。 



    15 、要打开编辑器脱字符处使用的类或者方法 Java 文档的浏览器,就按 Shift-F1 (右键菜单的 External JavaDoc )。 

    要使用这个功能须要把加入浏览器的路径,在“ General ”选项中设置( Options | IDE Settings ),另外还要把创建的 Java 文档加入到工程中( File | Project Properties )。 



    16 、用 Ctrl-F12 ( View | File Structure Popup )键你可以在当前编辑的文件中快速导航。 

    这时它会显示当前类的成员列表。选中一个要导航的元素然后按 Enter 键或 F4 键。要轻松地定位到列表中的一个条目,只需键入它的名字即可。 



    17 、在代码中把光标置于标记符或者它的检查点上再按 Alt-F7 (右键菜单中的 Find Usages… )会很快地查找到在整个工程中使用地某一个类、方法或者变量的位置。



    18 、按 Ctrl-N ( Go to | Class… )再键入类的名字可以快速地在编辑器里打开任何一个类。从显示出来的下拉列表里选择类。 
    同样的方法你可以通过使用 Ctrl-Shift-N ( Go to | File… )打开工程中的非 Java 文件。



    19 、要导航代码中一些地方使用到的类、方法或者变量的声明,把光标放在查看项上再按 Ctrl-B 即可。也可以通过按 Ctrl 键的同时在查看点上单击鼠标键调转到声明处。 


    20 、把光标放到查看点上再按 Ctrl-Alt-B 可以导航到一个抽象方法的实现代码。



    21 、要看一个所选择的类的继承层次,按 Ctrl-H ( Browse Type Hierarchy )即可。也可以激活编辑器中的继承关系视图查看当前编辑类的继承关系。22 、使用 Ctrl-Shift-F7 ( Search | Highlight Usages in File )可以快速高亮显示当前文件中某一变量的使用地方。按 Escape 清除高亮显示。 



    23 、用 Alt-F3 ( Search | Incremental Search )在编辑器中实现快速查查找功能。 

    在“ Search for: ”提示工具里输入字符,使用箭头键朝前和朝后搜索。按 Escape 退出。



    24 、按 Ctrl-J 组合键来执行一些你记不起来的 Live Template 缩写。比如,键“ it ”然后按 Ctrl-J 看看有什么发生。



    25 、 Introduce Variable 整合帮助你简化代码中复杂的声明。举个例子,在下面的代码片断里,在代码中选择一个表达式:然后按 Ctrl-Alt-V 。



    26 、 Ctrl-Shift-J 快捷键把两行合成一行并把不必要的空格去掉以匹配你的代码格式。



    27 、 Ctrl-Shift-Backspace ( Go to | Last Edit Location )让你调转到代码中所做改变的最后一个地方。 

    多按几次 Ctrl-Shift-Backspace 查看更深的修改历史。 



    28 、用 Tools | Reformat Code… 根据你的代码样式参考(查看 Options | IDE Setting | Code Style )格式化代码。 

    使用 Tools | Optimize Imports… 可以根据设置(查看 Options | IDE Setting | Code Style | Imports )自动“优化” imports (清除无用的 imports 等)。



    29 、使用 IDEA 的 Live Templates | Live Templates 让你在眨眼间创建许多典型代码。比如,在一个方法里键入 

    再按 Tab 键看有什么事情发生了。 
    用 Tab 键在不同的模板域内移动。查看 Options | Live Templates 获取更多的细节。



    30 、要查看一个文件中修改的本地历史,激活右键菜单里的 Local VCS | Show History… 。也许你可以导航不同的文件版本,看看它们的不同之处再回滚到以前的任何一个版本吧。 

    使用同样的右键菜单条目还可以看到一个目录里修改的历史。有了这个特性你就不会丢失任何代码了。



    31 、如果要了解主菜单里每一个条目的用途,把鼠标指针移到菜单条目上再应用程序框架的底部的状态栏里就会显示它们的一些简短描述,也许会对你有帮助。 



    32 、要在编辑器里显示方法间的分隔线,打开 Options | IDE Settings | Editor ,选中“ Show method separators ”检查盒( checkbox )。 



    33 、用 Alt-Up 和 Alt-Down 键可以在编辑器里不同的方法之间快速移动。 



    34 、用 F2/Shift-F2 键在高亮显示的语法错误间跳转。 

    用 Ctrl-Alt-Down/Ctrl-Alt-Up 快捷键则可以在编译器错误信息或者查找操作结果间跳转。



    35 、通过按 Ctrl-O ( Code | Override Methods… )可以很容易地重载基本类地方法。 

    要完成当前类 implements 的(或者抽象基本类的)接口的方法,就使用 Ctrl-I ( Code | Implement Methods… )。 



    36 、如果光标置于一个方法调用的括号间,按 Ctrl-P 会显示一个可用参数的列表。

    37 、要快速查看编辑器脱字符处使用的类或方法的 Java 文档,按 Ctrl-Q (在弹出菜单的 Show Quick JavaDoc 里)即可。 

    38 、像 Ctrl-Q ( Show Quick JavaDoc 显示简洁 Java 文档), Ctrl-P ( Show Parameter Info 显示参数信息), Ctrl-B ( Go to Declaration 跳转到声明), Shift-F1 ( External JavaDoc 外部 Java 文档)以及其它一些快捷键不仅可以在编辑器里使用,也可以应用在代码完成右键列表里。 



    39 、 Ctrl-E ( View | Recent Files )弹出最近访问的文件右键列表。选中文件按 Enter 键打开。 



    40 、在 IDEA 中可以很容易地对你的类,方法以及变量进行重命名并在所有使用到它们的地方自动更正。 

    试一下,把编辑器脱字符置于任何一个变量名字上然后按 Shift-F6 ( Refactor | Rename… )。在对话框里键入要显示地新名字再按 Enter 。你会浏览到使用这个变量地所有地方然后按“ Do Refactor ”按钮结束重命名操作。 



    41 、要在任何视图( Project View 工程视图, Structure View 结构视图或者其它视图)里快速 

    选择当前编辑地部分(类,文件,方法或者字段),按 Alt-F1 ( View | Select in… )。 


    42 、在“ new ”字符后实例化一个已知类型对象时也许你会用到 SmartType 代码完成这个特性。比如,键入 

    再按 Ctrl-Shift-Space :

    43 、通过使用 SmartType 代码完成,在 IDEA 中创建接口的整个匿名 implementation 也是非常容易的,比如,对于一些 listener (监听器),可以键入 

    Component component; 

    component.addMouseListener( 

      new <caret is here>   

    ); 

    然后再按 Ctrl-Shift-Space 看看有什么发生了。 



    44 、在你需要设置一个已知类型的表达式的值时用 SmartType 代码完成也很有帮助。比如,键入 

    String s = ( <caret is here>   

    再按 Ctrl-Shift-Space 看看会有什么出现。 



    45 、在所有视图里都提供了速查功能:在树里只需键入字符就可以快速定位到一个条目。 



    46 、当你想用代码片断捕捉异常时,在编辑器里选中这个片断,按 Ctrl-Alt-T ( Code | Surround with… )然后选择“ try/catch ”。它会自动产生代码片断中抛出的所有异常的捕捉块。在 Options | File Templates | Code tab 中你还可以自己定制产生捕捉块的模板。 

    用列表中的其它项可以包围别的一些结构。 


    47 、在使用代码完成时,用 Tab 键可以输入弹出列表里的高亮显示部分。 

    不像用 Enter 键接受输入,这个选中的名字会覆盖掉脱字符右边名字的其它部分。这一点在用一个方法或者变量名替换另一个时特别有用。 



    48 、在声明一个变量时代码完成特性会给你显示一个建议名。比如,开始键入“ private FileOutputStream ”然后按 Ctrl-Space 


    在 Options | IDE Setting | Code Style 中还可以为本地变量,参数,实例及静态字段定制名字。


    展开全文
  • Gcc优化选项

    万次阅读 2016-10-31 22:54:50
    gcc默认提供了5级优化选项的集合: -O0:无优化(默认)。 -O和-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化。 在编译大型程序的时候会显著增加编译时内存的使用和时间。 -O2: 此选项...


    gcc默认提供了5级优化选项的集合:

    -O0:无优化(默认)。

    -O和-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化。

    在编译大型程序的时候会显著增加编译时内存的使用和时间。

    -O2: 此选项将增加编译时间和目标文件的执行性能。

    包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化。

    编译器不执行循环展开以及函数内联。

    -Os:专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项,并且执行专门减小目标文件大小的优化选项。

    -O3:打开所有-O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning,-fgcse-after-reload and -ftree-vectorize优化选项。

     

    -O1:

        o1是最基本的优化,主要对代码的分支,表达式,常量来进行优化,编译器会在较短的时间下将代码变得更加短小,这样体积就会变得更小,会减少内存的占用率,在操作系统进行内存调度时就会更快。但是事情没有绝对的优点,当一个庞大的程序被拆碎细分的话,内存占用会大大增加,由于当今系统大多数都是多线程,就会出现卡顿和反应延迟。

    当在机子上,运行无法干涉到调试时,-O选项也会添加-fomit-frame-pointer选项。

    在ADA编译器上,-O不会添加-ftree-sra选项,想在ADA编译器下使用该选项,必须明确的在命令行指出。

    -O选项会添加以下的优化标志:

     -fdefer-pop    延迟到只在必要时从函数参数栈中pop参数

     -fdelayed-branch   

     -fguess-branch-probability   

     -fcprop-registers   

     -floop-optimize   

     -fif-conversion   

     -fif-conversion2   

     -ftree-ccp   

     -ftree-dce   

     -ftree-dominator-opts   

     -ftree-dse   

     -ftree-ter   

     -ftree-lrs   

     -ftree-sra   

     -ftree-copyrename   

     -ftree-fre   

     -ftree-ch   

     -funit-at-a-time   

     -fmerge-constants

     

    -O2:

    进一步的优化。GCC会支持所有不涉及时间空间交换的所有支持的优化选项。当加入-o2选项时,编译器不会进行循环展开和函数内联。与-O选项相比,这个选项会增加编辑时间和合成码的性能。

    这个优化级别是o1的进阶,在上一级的基础上会进行更严格的细分,最重要的是加入了寄存器的使用。寄存器是cpu中重要的组成部分,此外还有运算器和控制器,计算机顾名思义,要进行各种庞杂的计算,由于cpu速度较快,所以计算的中间结果都会保存在寄存器中,这样可以大大提高系统的效率,但是寄存器造价高昂,数量有限,所以一般来说程序不会放在寄存器中,另一种将代码放在寄存器的方式是使用register修饰变量,适用于频繁调用的变量。

    在引用了优化处理的计算跳转的程序理,请在-fgcse选项中注明警告。

      -O2选项会添加-O选项中添加的所有选项,同时,他也会添加下列选项标志。

       -fthread-jumps   

       -fcrossjumping   

       -foptimize-sibling-calls   

       -fcse-follow-jumps

       -fcse-skip-blocks   

       -fgcse

       -fgcse-lm      

       -fexpensive-optimizations   

       -fstrength-reduce   

       -frerun-cse-after-loop

       -frerun-loop-opt   

       -fcaller-saves   

       -fpeephole2   

       -fschedule-insns     

       -fschedule-insns2   

       -fsched-interblock

       -fsched-spec   

        -fregmove   

       -fstrict-aliasing   

       -fdelete-null-pointer-checks   

       -freorder-blocks

       -freorder-functions   

       -falign-functions

       -falign-jumps   

       -falign-loops

       -falign-labels   

       -ftree-vrp   

       -ftree-pre

      

    -O3:

    再一次的优化,-O3选项会添加所有-O2中添加的选项,并且添加`-finline-functions',`-funswitch-loops' and `-fgcse-after-reload' 这三个选项。

    这个优化属于非常强大的优化,因为编译器会进行预测,对循环每一层的预测,以便于将循环拆分,可以提高执行效率。编译器还会试图用已有的值来代替未知的值,并且还会用加代替乘,因为运算器的特性,乘法十分复杂耗时。当然o3的缺点最明显,那就是o3因为试图预测程序的走向,可能会出现误差,导致错误和程序不可逆转的走向。所以一般o3不建议使用。

    这是最高最危险的优化等级。用这个选项会延长编译代码的时间,并且在使用gcc4.x的系统里不应全局启用。自从3.x版本以来gcc的行为已经有了极大地改变。在3.x,-O3生成的代码也只是比-O2快一点点而已,而gcc4.x中还未必更快。用-O3来编译所有的软件包将产生更大体积更耗内存的二进制文件,大大增加编译失败的机会或不可预知的程序行为(包括错误)。这样做将得不偿失,记住过犹不及。在gcc 4.x.中使用-O3是不推荐的。

      

    -Os:

       原来-Os相当于-O2.5。是使用了所有-O2的优化选项,但又不缩减代码尺寸的方法。这对于磁盘空间极其紧张或者CPU缓存较小的机器非常有用。但也可能产生些许问题,因此软件树中的大部分ebuild都过滤掉这个等级的优化。使用-Os是不推荐的。

       详细的说明如下:

    Level 2.5 (-Os)

    The special optimization level (-Os orsize) enables all -O2 optimizations that do not increase code size; it puts theemphasis on size over speed. This includes all second-level optimizations,except for the alignment optimizations. The alignment optimizations skip spaceto align functions, loops, jumps and labels to an address that is a multiple ofa power of two, in an architecture-dependent manner. Skipping to theseboundaries can increase performance as well as the size of the resulting codeand data spaces; therefore, these particular optimizations are disabled. Thesize optimization level is enabled as:

      -Os这个特殊的优化等级,能够实现-O2的全部不增加代码段大小优化,他强调程序的大小而不是程序的运行速度,他包含了所有第二等级的优化,除了对齐优化,这些对齐优化在体系结构的依赖性的程序中,跳过一些线性结构,循环,跳转和标签的空间,到一个指数为2的多项式和的地址。跳过这些界限可以提高性能,以及由此产生的代码和数据空间的大小,因此,这些特定的优化被禁用。

     

    基本原理

    我们首先从三个方面来看与优化相关的内容:

    1. 从运行时的依赖关系来看,对性能有较大影响的组件有 kernel 和 glibc ,虽然这严格说来这不属于本文的话题,但是经过精心选择、精心配置、精心编译的内核与C库将对提高系统的运行速度起着基础性的作用。
    2. 从被编译的软件包来看,每个软件包的 configure 脚本都提供了许多配置选项,其中有许多选项是与性能息息相关的。比如,对于 Apache-2.2.6 而言,你可以使用 --enable-MODULE=static 将模块静态编译进核心,使用 --disable-MODULE 禁用不需要的模块,使用 --with-mpm=MPM 选择一个高效的多路处理模块,在不需要IPv6的情况下使用 --disable-ipv6 禁用IPv6支持,在不使用线程化的MPM时使用 --disable-threads 禁用线程支持,等等……这部分内容显然不可能在本文中进行完整的讲述,本文只能讲述与优化相关的通用选项。针对特定的软件包,请在编译前使用 configure --help 查看所有选项,并精心选择。
    3. 从编译过程自身来看,将源代码编译为二进制文件是在 Makefile 文件的指导下,由 make 程序调用一条条编译命令完成的。而将源代码编译为二进制文件又需要经过以下四个步骤:预处理(cpp) → 编译(gcc或g++) → 汇编(as) → 连接(ld) ;括号中表示每个阶段所使用的程序,它们分别属于 GCC 和 Binutils 软件包。显然的,优化应当从编译工具自身的选择以及控制编译工具的行为入手。

    大体上编译优化就这"三板斧"(其实是"三脚猫")了,本文接下来的内容将讨论这只猫的后两只脚。

    编译工具的选择

    对于编译工具自身的选择,在假定使用 Binutils 和 GCC 以及 Make 的前提下,没什么好说的,基本上新版本都能带来性能提升,同时比老版本对新硬件的支持更好,所以应当尽量选用新版本。不过追新也可能带来系统的不稳定,这就要针对实际情况进行权衡了。本文以 Binutils-2.18 和 GCC-4.2.2/GCC-4.3.0 以及 Make-3.81 为例进行说明。

    configure 选项

    这里我们只讲解通用的"体系结构选项",由于"特性选项"在每个软件包之间千差万别,所以不可能在此处进行讲解。下面只列出常用的值:

    • i586-pc-linux-gnu
    • i686-pc-linux-gnu
    • x86_64-pc-linux-gnu
    • powerpc-unknown-linux-gnu
    • powerpc64-unknown-linux-gnu

    编译选项

    让我们先看看 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 是传递给连接器的选项。这是一个常被忽视的变量,事实上它对优化的影响也是很明显的。

    -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"。

    展开全文
  • layui的tab选项

    千次阅读 2019-05-27 08:31:57
    Tab切换卡 开发工具与关键技术:MVC ...下面就说说在body里的代码结构:最外层先给一个 class=“layui-tab” 里面有两,一个是用ul标签装切换卡的表头(名称),一个是div包裹着的内容,如图: 很明显ul标签...

    Tab切换卡

    开发工具与关键技术:MVC
    撰写时间:2019.05.27
    

    效果图:
    在这里插入图片描述
    在这里插入图片描述
    Layui的tab切换卡,里面居然隐藏着一个关键模块,可以说如果没有这个声明的模块,那切换的功就不能实现。
    下面就说说在body里的代码结构:最外层先给一个 class=“layui-tab” 里面有两层,一个是用ul标签装切换卡的表头(名称),一个是div包裹着的内容,如图:
    在这里插入图片描述
    很明显ul标签里面装的就是用li标签装的“线上订单”和“线下订单”:

    <ul class="layui-tab-title">
       <li class="layui-this">线上订单</li>
       <li>线下订单</li>
    </ul>
    

    而第二个div标签里面装的肯定就是,“线上订单”下方的内容和“线下订单”下方的内容:
    在这里插入图片描述
    下面就是重点了,以上内容只能说明你把页面结构和页面内容给打好了,但是你要是想要实现,你点击“线上订单”或者“线下订单”就会打开你点击的那个窗口,你必须要用element模块,也就是:

    <script>
       layui.use('element', function () {
           var $ = layui.jquery
           , element = layui.element; //Tab的切换功能,切换事件监听等,需要依赖element模块
       });
    </script>
    

    还有要用上layui的css样式插件和js插件,
    在这里插入图片描述

    展开全文
  • 对于一般用户无需关注,所以往往开发者选项在新版本中都会隐藏,需要特殊操作才会展示入口,比如连续点击版本号等等。当然还有许多国内定制系统打开开发者选项的方式不尽相同,有的还会阉割掉部分功能,在各个版本...
  • gcc警告选项汇总

    万次阅读 2018-04-18 14:19:33
    请求或取消警告的选项 警告是诊断消息,报告的结构本质上不是错误的,但是有风险或表明可能有错误。 以下与语言无关的选项不会启用特定的警告,但会控制GCC生成的诊断类型。 -fsyntax-only 检查代码中的...
  • Linux kernel 配置选项

    千次阅读 2019-01-17 17:14:37
    常规设置 Cross-compiler tool prefix CONFIG_CROSS_COMPILE 交叉编译工具前缀(比如"arm-linux-"相当于使用"make CROSS_COMPILE=arm-linux-"进行编译).除非你想配置后默认自动进行交叉编译,...
  • uniapp 选项卡动态切换更新数据问题

    千次阅读 2020-05-21 19:44:50
    选项卡a,b,c 下面的 scrollor 滑动块 点击a 给循环变量data赋值a数组 点击b 给循环变量data赋值b数组 … 以上场景比如点击表情包,下面的表情内容会改变,而且表情是左右可以滑动的,像qq或者微信那样。此类场景经常...
  • IntelliJ IDEA 常用设置讲解

    千次阅读 2016-07-02 10:23:26
    本篇内容为大家提供的是IntelliJ IDEA 使用教程中的IntelliJ IDEA 常用设置讲解,IntelliJ IDEA是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构...
  • Altium Dsigner——多层PCB层叠结构

    千次阅读 2019-03-29 10:26:50
    在设计多层PCB电路板之前,设计者需要首先根据电路的规模、电路板的尺寸和电磁兼容(EMC)的要求来确定所采用的电路板结构,也就是决定采用4,6,还是更多数的电路板。确定数之后,再确定内电的放置位置...
  • 解决WORD疑难之:设置节起始页码后出现诡异隐藏页/跳页、节首页页面边框丢失 适用软件及版本:MS OFFICE2003 pro中的WORD,其它版本应可适用。 适用人群:编排大中型复杂文档的用户 症状:文档中的某些节首页页数...
  • 在APP中,底部的选项卡菜单一般是各个APP都有的,在mui中怎样创建呢,下面就简单说下。极速创建【文件】->【新建】->【HTML文件】,然后在弹出窗口下面的“选择模板组:”中选中“mui底部选项卡(Webview模式)”。...
  • Linux内核配置选项简介

    千次阅读 2017-07-13 08:55:48
    Linux内核配置选项简介   Gentoo Linux Gentoo内核(gentoo-sources)特有的选项 Gentoo Linux support CONFIG_GENTOO_LINUX 选"Y"后,将会自动选中那些在Gentoo环境中必须开启的内核选项,以避免用户...
  • 【精】多层PCB层叠结构

    千次阅读 2014-12-03 21:12:11
    在设计多层PCB电路板之前,设计者需要首先根据电路的规模、电路板的尺寸和电磁兼容(EMC)的要求来确定所采用的电路板结构,也就是决定采用4,6,还是更多数的电路板。确定数之后,再确定内电的放置位置...
  • Linux内核配置选项 (经典学习)

    千次阅读 2019-01-22 18:09:10
    下面以最新的Linux 2.6.20内核为例,介绍比较常用的一些Linux内核配置选项,其他选项读者可以参考系统提供的帮助信息。 需要说明的是,在内核配置中,某项选择Y表示把该项选择进内核,选择M则表示把该项编译成模块...
  • tar 隐藏文件

    千次阅读 2015-03-30 10:02:26
    通常使用的“tar -zcvf”命令不会打包压缩文件夹下到隐藏文件,下面到命令解决这个问题: tar -zcvf xxx.tar.gz `ls -a`
  • div重叠和隐藏显示

    千次阅读 2015-08-01 08:53:46
    又到周末了。今天又是新的一个月的开始,大家用充满愉快的心情开始这个月的生活吧。 有这么一个需求,就是一个报表模块,这个模块中,有多个报表,...只显示第一个DIV的报表,重叠的都隐藏起来。在查询栏中添加一个报表
  • js实现京东购物放大镜和选项卡效果

    千次阅读 2016-08-25 22:43:46
    下面我们来一起做这个小效果吧!首先,我们看一下页面的布局: 1.小图片显示区,上面有一个方形遮罩 2.缩略图横向列表 3.大图显示区域然后,我们写出开发步骤: 1.编写3个区域的html布局,使他们位于同一个...
  • 选项卡的新增以及切换 选项卡刷新 选项卡各种删除:删除其他、删除右侧所有、删除所有 OK,直接上代码,一些引入文件就不写了,这里只列出主要的代码,有需要的话可以去下载完整源码。 布局: <body class=...
  • 卷积层与池化

    万次阅读 多人点赞 2018-08-04 16:08:16
    卷积神经网络(Convolutional Neural Layer, CNN),除了全连接以外(有时候也不含全连接,因为出现了Global average pooling),还包含了卷积层和池化。卷积层用来提取特征,而池化可以减少参数数量。 卷...
  • 用Python实现多层感知器神经网络

    千次阅读 2020-09-07 23:01:29
    图1:感知器 对于有监督的学习,我们稍后将输入的数据通过一系列隐藏层转发到输出。这称为前向传播。在输出,我们能够输出预测y。通过我们的预测y*,我们可以计算误差| y-y | 并使误差通过神经网络向后传播。这...
  • 多层PCB层叠结构

    千次阅读 2017-11-03 10:58:37
    在设计多层PCB电路板之前,设计者需要首先根据电路的规模、电路板的尺寸和电磁兼容(EMC)的要求来确定所采用的电路板结构,也就是决定采用4,6,还是更多数的电路板。确定数之后,再确定内电的放置位置...
  • 在 Web 开发中出于多种原因,我们需要隐藏元素。例如,一个按钮应该在移动中可见,而在桌面视口中隐藏。或者,在移动设备上隐藏但要在桌面上显示的导航元素。隐藏元素时有三种不同的状态:元素完...
  • ALV中的fieldcat常用字段属性选项大全

    万次阅读 2017-05-09 15:49:07
    Key_sel 这个参数只和设置了key的字段相关,和key一起使用,可以交互式的隐藏设置为KEY的字段(alv_list有效) tech 技术字段,设置’X’后,该字段不会显示,也不能输出,如同MANDT字段一样的效果 symbol 作为...
  • android 原生camera——设置模块修改

    千次阅读 2016-12-16 21:56:59
    不知道有没有看明白,我在简单说下,没修改前Camera 设置中是有两个选项的一个负责预览大小(显示的宽高比如16:9),一个负责照片大小(如1600x1200),修改后 只要一个Picture Size 即负责切换预览大小也负责
  • 添加v-if 判断是为了在添加中显示,而修改时隐藏,由于第一次学习写vue,只能使用比较笨的方式 下面实现步骤 这里的children是后台查询出来的所有子类 我在初始化时就加载了查询全部的方法 并在查询时,...
  • 内核编译配置选项含义

    千次阅读 2012-05-25 11:08:37
    Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名...
  •  软件启动后,在引导界面中,我们直接点击“Capture”部分下面的Capture Options快捷按钮【第一篇博文的图2最下方】,弹出下图所示的捕获选项窗口, 图2-1 Capture Options(数据包捕获选项)弹窗  通过上图,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,277
精华内容 24,910
关键字:

下面设置层隐藏的选项是