这段代码的执行时间

do_fork 2009-11-13 12:26:51
#include <stdio.h>

int main()
{
int i,j;
for (i=0; i<99999999; i++)
for (j=0; j<99999999; j++)
;//nothing to do
}



gcc t.c 编译
执行时间很久,等不到结束,人工终止它了

gcc -O t.c 编译
瞬间执行完毕

gcc优化后, 实际上代码是这样的
#include <stdio.h>

int main()
{
}



VC编译器,应该也能对此类代码也有所优化,
是默认优化还是需要打开哪个开关?
...全文
413 36 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
a364604 2009-11-14
  • 打赏
  • 举报
回复
来学习的,结果…………
晕了
up
mmilmf 2009-11-13
  • 打赏
  • 举报
回复
优化的时候要使用release版本
mmilmf 2009-11-13
  • 打赏
  • 举报
回复
主要通过VC的菜单项Project->Settings->C/C++->Category->Optimizations:代码优化设置。可以选择Maximize Speed生成最快速的代码,或Minimize Size生成最小尺寸的程序,或者Customize定制优化。
jackyjkchen 2009-11-13
  • 打赏
  • 举报
回复
现在回答问题:

问题一:我个人的感觉啊,可能楼主不用VC,debug、release双默认版本的感受不是那么清晰,在VC的设计原则中,debug就是老老实实按照C语句进行汇编的,不做任何优化,无论这种优化有没有副作用(我可以说VC的O1、O2优化都没有副作用,由于VC的优化所直接造成的软件逻辑问题是极少的,那为什么VC不默认就O2呢?)。而且软件情况复杂,编译器又如何判断某种代码就完全不会用到而将及优化掉呢?而且,优化逻辑可能是交叉的或多作用的,优化掉楼主的循环的优化逻辑还可能会有其他动作……最重要的是,debug模式是给人调试的,要的就是完全按照代码明文所确定的逻辑来跑,如果调试的流程和代码所体现的不同,会造成混乱!
jackyjkchen 2009-11-13
  • 打赏
  • 举报
回复
VC2008,不加优化老老实实算
只要加优化,o1,o2,ox都是优化成空的函数

反汇编指令只剩下
00401000 xor eax,eax
00401002 ret
baihacker 2009-11-13
  • 打赏
  • 举报
回复
vc9,DEBUG禁用优化很长
release:
最大化速度(/O2) 瞬间
完全优化(/Ox) 瞬间
最小化大小(/O1) 瞬间
do_fork 2009-11-13
  • 打赏
  • 举报
回复
两个问题,1个100分

问题一,
这种优化,若没有副作用(包括潜在的),编译器没理由加个开关,副作用是什么呢?
(用这种循环实现sleep本身就是不良做法,应该避免的,所以这类用法不算)

问题二,
除了用volatile修饰以外,还有什么方法可以在不关闭优化开关的情况下,抑制这个优化?
(不能增加无谓的运算)
desdouble 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 do_fork 的回复:]
引用 12 楼 jackyjkchen 的回复:
就比较流行的静态语言开发工具来说,我见过的只有delphi,在默认情况下就把优化开得很足,delphi的编译选项较少,而且也不会对代码速度造成较大的影响,这与delphi的用途——快速图形开发有关,也与pascal的语言特点——比较固定比较明确(逻辑上容易处理)有关。


delphi给我留下的印象是,编译起来速度超快,也许是因为同出一门的BCB实在太慢了


刚才我试过了,gcc  -O打开的25个参数,全部打开,也没有优化掉它,
看来通过编译器参数做调整,gcc里是没法达到目的了
[/Quote]

GCC版本的问题。4.0.0优化不掉LZ的C代码。但gcc4.3.2可以。
jernymy 2009-11-13
  • 打赏
  • 举报
回复
mark一下
2009-11-13
  • 打赏
  • 举报
回复
静态围观大牛们讨论~~
james_hw 2009-11-13
  • 打赏
  • 举报
回复
mark一下,虽然不是太需要深入了解,知道一点总是好的
  • 打赏
  • 举报
回复
[Quote=引用楼主 do_fork 的回复:]
C/C++ code#include<stdio.h>int main()
{int i,j;for (i=0; i<99999999; i++)for (j=0; j<99999999; j++)
;//nothing to do}


gcc t.c 编译
执行时间很久,等不到结束,人工终止它了

gcc -O t.c 编译
瞬间执行完毕

gcc优化后, 实际上代码是这样的
C/C++ code#include<stdio.h>int main()
{
}


VC编译器,应该也能对此类代码也有所优化,
是默认优化还是需要打开哪个开关?
[/Quote]
.
desdouble 2009-11-13
  • 打赏
  • 举报
回复
就这么沉了?
  • 打赏
  • 举报
回复
飞雪再次出没,收藏了。
liuchui2009 2009-11-13
  • 打赏
  • 举报
回复
我是过来学习的

结果还是没学懂

差距啊 先mark 有时间好好琢磨下
fthislife 2009-11-13
  • 打赏
  • 举报
回复
gahyyai 2009-11-13
  • 打赏
  • 举报
回复
mark
zgjxwl 2009-11-13
  • 打赏
  • 举报
回复
up
magicpang 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 do_fork 的回复:]
引用 4 楼 jackyjkchen 的回复:
现在回答问题:

问题一:我个人的感觉啊,可能楼主不用VC,debug、release双默认版本的感受不是那么清晰,在VC的设计原则中,debug就是老老实实按照C语句进行汇编的,不做任何优化,无论这种优化有没有副作用(我可以说VC的O1、O2优化都没有副作用,由于VC的优化所直接造成的软件逻辑问题是极少的,那为什么VC不默认就O2呢?)。而且软件情况复杂,编译器又如何判断某种代码就完全不会用到而将及优化掉呢?而且,优化逻辑可能是交叉的或多作用的,优化掉楼主的循环的优化逻辑还可能会有其他动作……最重要的是,debug模式是给人调试的,要的就是完全按照代码明文所确定的逻辑来跑,如果调试的流程和代码所体现的不同,会造成混乱!


debug跟release,除了编译和链接参数的差别,还有没有其它差异呢?
[/Quote]

debug出来的东西比较大,同release相比,里面多了debug的symbol table,
看是用的什么了,gcc 里面不是有 gstabs, swarf2之分么?(这两个名字记不清楚了)
baihacker 2009-11-13
  • 打赏
  • 举报
回复
3.4 Name lookup [basic.lookup]
1 The name lookup rules apply uniformly to all names (including typedef-names (7.1.3), namespace-names
(7.3) and class-names (9.1)) wherever the grammar allows such names in the context discussed by a particular
rule. Name lookup associates the use of a name with a declaration (3.1) of that name. Name lookup
shall find an unambiguous declaration for the name (see 10.2). Name lookup may associate more than one
declaration with a name if it finds the name to be a function name; the declarations are said to form a set of
overloaded functions (13.1). Overload resolution (13.3) takes place after name lookup has succeeded. The
access rules (clause 11) are considered only once name lookup and function overload resolution (if applicable)
have succeeded. Only after name lookup, function overload resolution (if applicable) and access
checking have succeeded are the attributes introduced by the name’s declaration used further in expression
processing (clause 5).


这玩意儿确实很复杂,尤其是有模板的时候.
ADL,受限的,非受限的,依赖的,依赖的...乱七八糟的一大堆...
在遇到继承的时候,遇到名字空间的时候...呀...会晕的...

于是就睡觉了.
加载更多回复(16)
资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在开发 Vue 项目时,跨域问题是一个常见的挑战,主要是由于浏览器的同源策略限制了不同源之间的请求。本文将介绍几种解决跨域问题的方法,适用于使用 vue-cli 脚手架搭建的项目。 在后端服务器上,可以通过修改响应头来解决跨域问题。例如,在 PHP 中,可以设置 Access-Control-Allow-Origin 为 *,以允许所有来源的请求,同时设置 Access-Control-Allow-Methods 为 POST, GET,以允许跨域的 POST 和 GET 请求。代码示例如下: 在前端开发环境中,可以使用 http-proxy-middleware 来设置代理,从而绕过浏览器的同源策略。在 vue-cli 项目中,打开 config/index.js 文件,并在 proxyTable 对象中添加以下配置: 这样,前端的请求路径以 /api 开头时,http-proxy-middleware 会自动将请求转发到目标地址。 axios 是一个常用的 HTTP 库,用于处理前后端交互。可以在项目的 main.js 文件中全局配置 axios,例如设置 POST 请求的 Content-Type: 在组件中,可以通过 this.$axios 发起请求: Fetch API 是另一种发起 HTTP 请求的方式,同样支持跨域。在 Vue 组件中,可以使用以下代码发起 POST 请求: 如果目标服务器只支持 JSONP,可以使用 jQuery 的 $.ajax 方法,并设置 dataType 为 JSONP。例如: Vue 项目中的跨域问题可以通过调整后端服务器的 Header 或在前端使用 http-proxy-middleware 代理来解决。对于支持 JSONP 的 API,还

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧