当前位置:首页 » 编程语言 » c语言的不可优化
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言的不可优化

发布时间: 2022-04-27 22:06:54

A. 如果c语言函数参数太多,可以怎么优化

一个函数的参数的数目没有明确的限制,但是参数过多(例如超过8个)显然是一种不可取的编程风格。参数的数目直接影响调用函数的速度,参数越多,调用函数就越慢。另一方面,参数的数目少,程序就显得精练、简洁,这有助于检查和发现程序中的错误。因此,通常应该尽可能减少参数的数目,如果一个函数的参数超过4个,你就应该考虑一下函数是否编写得当。 如果一个函数不得不使用很多参数,你可以定义一个结构来容纳这些参数,这是一种非常好的解决方法。在下例中,函数print_report()需要使用10个参数,然而在它的说明中并没有列出这些参数,而是通过一个RPT_PARMS结构得到这些参数。 # include <atdio. h> typedef struct ( int orientation ; char rpt_name[25]; char rpt_path[40]; int destination; char output_file[25]; int starting_page; int ending_page; char db_name[25]; char db_path[40]; int draft_quality; )RPT_PARMS; void main (void); int print_report (RPT_PARMS* ); void main (void) { RPT_PARMS rpt_parm; /*define the report parameter structure variable * / /* set up the report parameter structure variable to pass to the print_report 0 function */ rpt_parm. orientation = ORIENT_LANDSCAPE; rpt_parm.rpt_name = "QSALES.RPT"; rpt_parm. rpt_path = "Ci\REPORTS" rpt_parm. destination == DEST_FILE; rpt_parm. output_file = "QSALES. TXT" ; rpt_parm. starting_page = 1; rpt_pann. ending_page = RPT_END; rpt_pann.db_name = "SALES. DB"; rpt_parm.db_path = "Ci\DATA"; rpt_pann. draft_quality = TRUE; /*call the print_report 0 function; paaaing it a pointer to the parameteM inatead of paMing it a long liat of 10 aeparate parameteM. * / ret_code = print_report(cu*pt_parm); } int print_report(RPT_PARMS*p) { int rc; /*acccM the report parametcra paaaed to the print_report() function */ oricnt_printcr(p->orientation); Kt_printer_quality((p->draft_quality == TRUE) ? DRAFT ; NORMAL); return rc; } 上例唯一的不足是编译程序无法检查引用print_report()函数时RPT_PARMS结构的10个成员是否符合要求。

B. vc++ 感觉无法优化了,但速度还是比c#慢是怎么回事

C++的基础是C语言,C语言更加接近底层一些,最接近底层的是汇编语言,一般做底层开发(比如驱动程序)都使用汇编或c语言。如果开发过程中不涉及到底层开发,大可不必学习C++或C语言,直接使用可视化开发工具进行开发,比如VB或C#。现在很多开发

C. 请问我这个c语言代码还能更加优化吗!

优化0:题目要求输入学生个数上限,所以输入n那里需要验证。

优化1:减少循环次数,题目没有说找最大最小必须单独循环。那么直接在输入循环的时候就能得结果。

优化2:你的j每次只循环一次,没有必要。

优化3:输入那里用临时变量传递,没必要,直接用数组地址。

优化4:数组最大值定义常量,便于后期程序修改参数。

下面代码,我完全按照你的写法写的,你拿来参考。(要是学过指针,比大小那里试试换成指针更好)

#include <stdio.h>

#define MS 40//最大学生人数

int main()

{

int n=0,i;

int a[MS][2];

int minmark,maxmark,minxuehao,maxxuehao;

while(!n || n>MS)

printf("请输入学生数量:"),scanf("%d",&n);

for(i=0;i<n;i++)

{

printf("请输入学生学号:");

scanf("%d",&a[i][0]);

printf("请输入学生成绩:");

scanf("%d",&a[i][1]);

if(i==0)

minmark=maxmark=a[0][1];

else{

if(minmark>a[i][1]) minmark=a[i][1],minxuehao=a[i][0];

if(maxmark<a[i][1]) maxmark=a[i][1],maxxuehao=a[i][0];

}

}

printf("最高分为%d,学号为%d ",maxmark,maxxuehao);

printf("最高分为%d,学号为%d ",minmark,minxuehao);

return 0;

}

D. c语言优化,有满意答案给100分

我路过,说一句:程序执行时代码是保存在代码区的,这个区是只读的,也就是说你不能在运行时改变你的代码!所以你的想法是不现实的!当然高手有办法实现,通过程序该exe文件然后加多进程的方式,但你说你只会一点C语言,那这个方法就~~~难于上那什么天了哈!!!

不过我提醒你一下

ID鸡蛋炒韭菜 正解,别听anan640925瞎扯,故作高深!!!只是 ID鸡蛋炒韭菜 没说详细而已!

把大循环做成两个版本的代码,版本1,加入那一段你要重复调用的代码,版本2,不加你要重复调用的代码,这样,当那个什么状态为否的时候,调用版本1,为是的时候呢,就调用版本2!下面是伪代码:
if(状态为是)
{
for(i=0;i<10000;i++)
{
版本2;//调用了和状态相关的代码

}
}
else
{
for(i=0;i<10000;i++)
{
版本1;//不调用和状态相关的代码

}
}

这样其实也就是实现了你的那个想法!当然咯,会在内存空间上带来那么一点点浪费!!!

你要想继续优化内存空间呢,那么就做三个函数,也就是把你大循环中要做的事拆成3部分:
第一个,你大循环中要在调用的那个和条件关的部分的前面那部分,然后是相关部分,然后是后面部分,对应的伪代码是

if(a==0)
{
for(i=0;i<10000;i++)
{
前部分
相关代码
后部分

}
}
else
{
for(i=0;i<10000;i++)
{
前部分
后部分

}
}

这样是不是就更贴合你的想法了呢?

不过你继续看下去,我又要泼冷水了,呵呵!
虽然这样子看起来既省时间又省空间,但是不可忽视的一个耗时部分就是函数调用时的堆栈操作,最开始的方案中会有1n个调用,第二个方案中会有3n或者2n个调用!!!这个算起来,远远 ID鸡蛋炒韭菜 说的设一个标志再判断这个标志的时间要多!!!懂了吗?

再回过头看看你的想法,你觉得插入一段函数代码,再跳到这个缓冲区不要花时间吗?你绝对这个时间花费比一句if(flag==0)要少么?

我告诉你,一句if(flag==0),编译器之后也就一句JNE指令,而你说的那个想法,至少要一对MOV指令再加一句JMP指令,你现在说 哪个更省时?

再啰嗦一句,程序优化是比较高级的东西,没看到你代码,不好发言!时间和空间是矛盾的,要么选第一个方案,以空间换时间,要么选判断标志,以时间换空间!

跟你说个例子,我的一个老师做的单片机程序,我用C语言做的 编译出来700多字节,他改成了汇编的 13条指令完美解决 空间优化了几十倍!!! 那设计,太巧妙了。所以说优化无止境,量力而行。

回归正题:答案还是 ID鸡蛋炒韭菜 正解!标准的以少量时间换空间的方法。

我说的第一个方案是以空间换时间的方法!

你自己斟酌用那个方法!

E. 几种C语言优化代码技巧

以下内容摘自李亚锋先生的《经典C面试真题精讲》
1.结构体设计为成员最长类型长度的整数倍;
2.减少函数参数的个数,不需要返回值的函数定义为void类型;
3.if...else....多条件分支语句中,把出现频率高的条件放在前面;
4.同时声明多个相同类型变量优于分别单独声明变量;
5.减少定义全局变量;
6.使用#define定义常量和小的函数实现;
7.有些情况嵌套汇编语句效率更高;
8.占用大的存储空间可以减少执行时间,同理时间也可以换取空间;
9提高程序算法效率;

F. c语言防止优化

编译器编译命令里有设置选项,通过设置,你可以要求 不优化,也可以要求用哪种优化。
具体选项有哪些,要查自己编译器的帮助文件。
例如,MS VC++ 6.0 编译器编
优化选项:
/O1:优化使产生的可执行代码最小
/O2:优化使产生的可执行代码速度最快
/Oa:指示编译器程序里没有使用别名,可以提高程序的执行速度
/Ob:控制内联(inline)函数的展开
/Od:禁止代码优化
/Og:使用全局优化
/Oi:用内部函数去代替程序里的函数调用,可以使程序运行的更快,但程序的长度变长
/Op:提高浮点数比较运算的一致性
/Os:产生尽可能小的可执行代码
/Ot:产生尽可能块的可执行代码
/Ow:指示编译器在函数体内部没有使用别名
/Ox:组合了几个优化开关,达到尽可能多的优化
/Oy:阻止调用堆栈里创建帧指针

/O2 为了加速,会优化掉。 选 /Od 不优化。

G. c语言函数优化

c函数是一个独立的程序段,它执行具体的、明确的任务
特点:
一个函数只能返回一个值
一个程序可以有一个或多个函数
函数可以嵌套调用,但不能在一个函数中定义另一个函数
无论函数是否有参数,一定要有括号
函数在定义或使用前应在main() 函数中进行声明

H. 【50分】c语言程序优化

本题一个完整的c程序如下,在win-tc和Dev-c++下调试通过。
这里没有使用结构体,也可以改写为结构体。这里利用的是交换数组的编号,同时程序可以判断当输入职工号重复时,提醒重新输入,效果不错。
/*职工管理系统
该系统的功能包括输入、排序、查找。主程序中包括3个函数其中input()函数的功能是:
输入职工的姓名和职工号。sort()函数的功能是:按职工号由小到大排序,姓名顺序也随之调整。 search()函数的功能是:根据主函数提供的职工号进行查找,若找到该职工则输出对应职工的姓名, 若找不到则输出“not find”。
*/
#include<stdio.h>
#include"string.h"
#define NUMMAX 100
int order[NUMMAX];
void input(int a[],char b[][20],int n)
{
int i=0,j,k,flag;
do
{ flag=0;
printf("please input No.%d worker's code:\n",i+1);
scanf("%d",&a[i]);
printf("please input No.%d worker's name:\n",i+1);
scanf("%s",b[i]);
for(j=0;j<i;j++)
{ for(k=j+1;k<i+1;k++)
if(a[k]==a[j])
{ printf("The code has been inputted! Please input again!\n");
flag=1;
break; /*如有重复立即退出该层循环,提高判断速度*/
}
if(flag==1)
break; /*如有重复立即退出该层循环,提高判断速度*/
}
if(flag==0)
{ order[i]=i;
i++;
}
}while(i<n);
}

void sort(int a[],int n)
{
int i,j,k;
char t[20];
for(i=0;i<n-1;i++) /* 选择排序 */
for(j=i+1;j<n;j++)
if(a[order[i]]>a[order[j]]) /* 交换的是次序不是元素 */
{k=order[i]; /* 这是处理不用结构体使数据一起移动的一种好方法 */
order[i]=order[j];
order[j]=k;
}
}

void search(int n,int num,int a[],char b[][20])
{int i,flag=0;
for(i=0;i<n;i++)
if(num==a[order[i]])
{printf("The worker you find is:%s\n",b[order[i]]);
flag=1;
}
if(flag==0)
printf("Not find!\n");
}

int main()
{
char c,name[NUMMAX][20]; /*职工号数值应在int可以表示的范围内*/
int i,n,code[NUMMAX],num,flag=1;
printf("please input number of workers(<100):\n");
scanf("%d",&n);
input(code,name,n);
sort(code,n);
printf("The sequence of workers after sort are:\n");
for(i=0;i<n;i++)
printf("%-10d%s\n",code[order[i]],name[order[i]]);
while(flag==1)
{
printf("\nInput code to search:");
scanf("%d",&num);
search(n,num,code,name);
printf("\ncontinue or not(Y/N)?");
c=getch();
if(c=='N'||c=='n')
flag=0;
}
return 0;
}