鄙视c99

iamliadai 2007-07-15 03:15:16
c99的一些新特性违背了c语言的初衷--效率。就拿个变长数组的实现来说要比定常数组多出了几十条指令。这是c99出道近十年以来不能普及的直接原因。到目前为之已经证明,c99是失败的。ansi c还要大行其道若干年
...全文
1366 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
C821215 2008-09-08
  • 打赏
  • 举报
回复
void f(int m) {
int a[m];
....
}
??

呃,我没有读C99..不过以编译程序来看.....是应该编译成栈式分配还是堆式分配??
如果是栈式很容易实现啊.如果是堆式么..也不困难啊(只是对性能有影响).

不明白LZ为什么讨厌这个. 如果以栈式分配,应该如以下汇编:
...
mov eax, m
sub esp, eax /** 保留m个空间给变量数组a */
...

不难实现的嘛....






frisky_lobo 2008-09-01
  • 打赏
  • 举报
回复
其实在自己编写类的时候,经常自己设计变长空间,如果有变长数组,当然简单多了
AlwaysSLH 2008-08-27
  • 打赏
  • 举报
回复
偶再来挖挖,呵呵
^_^
aozhi 2008-08-26
  • 打赏
  • 举报
回复
发现不好的,就要提出来讨论。支持lz。
laomai 2008-08-26
  • 打赏
  • 举报
回复
这么老的帖子也有人挖坟?
scarsty 2008-08-08
  • 打赏
  • 举报
回复
科技的进步就是这么被迟滞的
fanjijie 2008-08-06
  • 打赏
  • 举报
回复
学习
fallening 2008-06-26
  • 打赏
  • 举报
回复
不用c99,平常程序-ansi选项必选的
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
不会,帮顶
积木 2008-03-30
  • 打赏
  • 举报
回复
广告做在人气帖子里面,真牛B啊。
LaoPoZaiNa 2008-03-26
  • 打赏
  • 举报
回复
先看看,不敢发言^-^
tang_cheng 2008-02-17
  • 打赏
  • 举报
回复
alloca是从stack中分配的,不需要释放.malloc是从heap中分配,需要释放。所以对于C99所谓的动态数组完全可以用alloca模拟且不影响效率。
helodd 2008-01-15
  • 打赏
  • 举报
回复
mark.
suyouxin 2008-01-14
  • 打赏
  • 举报
回复
MARK,还没用过C99,感觉动态数组用得不是很多,而且对于栈比较小的程序来说,不放心把动态数组放到栈上,不过的确把原来程序员做的事仍给编译器了。

如果能保证动态数组来带的安全性问题,还是很方便的,总比malloc free快,总可以节约点内存
agaric 2008-01-03
  • 打赏
  • 举报
回复
如果有足夠的可移植性,我會使用c99。

之前將部分c99 代碼移植到一個不支持c99的編譯器上,費了不少勁兒。
laomai 2008-01-02
  • 打赏
  • 举报
回复
先看看,不敢发言
mu_yang 2007-12-30
  • 打赏
  • 举报
回复
mark
zenny_chen 2007-12-04
  • 打赏
  • 举报
回复
事实上,以上所列出的C99特性我都在企业开发上用过。而且本人从事嵌入式系统,时间效率和空间效率都非常看重。可能是由于编译环境以及目标机器的关系。
在VisualDSP++中对动态数组的处理不需要十几条指令(指令本身也是RISC)。

事实上,由于在C语言中,变量的声明和定义必须放在函数开头。因此,编译器可以在运行时增加几条处理指令,将数组长度变量获取之后,再为动态数组分配栈。当然,如果有多个动态数组,那么栈中可能会留出特定的空间存放动态数组的首地址。在运行时通过数组长度的变量值以及守护栈指针(X86中的BP,Blackfin中的FP)将动态数组首地址回填到相应的数组首地址标识处。所有这些动作不会显得十分复杂。

而C++要实现这个机制就显得麻烦很多。比如看下面:

void Test(int a)
{
if(a < 0)
{
int b = a++;
int c = a * b;
}
else
{
int b = 1;
for(int i=0; i<a; i++)
b += a + i;
}
}


呵呵,难度够大吧。
zenny_chen 2007-12-04
  • 打赏
  • 举报
回复
首先,我非常喜欢C99。现在大多数高级嵌入式编译环境都支持C99,比如我现在用的VisualDSP++4.5(现在5.0也出来了)。
首先,对于动态数组长度并不难实现。我认为,像C++中的异常抛出和捕获难度比它还要大很多。
其次,C99除了增加了动态长度数组特性外还增加了许多非常人性化的特性:
1、不定参数的宏定义:

#ifdef _DEBUG
#define TRACE(...) (void)printf(__VA_ARGS__)
#else
#define TRACE(...)


2、极其方便地定义稀疏矩阵或数组:

int a[100] = { [0] = 1, [6] = -1, [10] = 2 };


3、灵活的结构变量、联合变量初始化:

struct Hello
{
int a, b, c;
};

struct Hello hello = { .a = 10, .c = -1 };

// 联合还要方便:
union Type
{
int i;
float f;
char* str;
};

union type t1 = { .f = 0.23f };
union type t2 = { .i = 100 };
union type t3 = { .str = "Hello, world!" };

如果是C89的话,如果要对一个联合类型定义同时初始化,那么类型总是默认为第一个数据类型。
也就是说在C89中,union type t3 = { "Hello, world" };实际上是非法的。

4、内联:
在C99中正式将inline作为关键字纳入。当然对于熟悉C++的人来说,内联函数的好处比宏大很多。

WillyWonka 2007-11-22
  • 打赏
  • 举报
回复
其实我觉得C99在某些方面还是为了C语言的生存状况在考虑`,和大多数语言比较而言,C还是相对比较低级的,对C语言的改进是迟早的事,效率问题只是一方面,就拿386来说,早期如果有1台386算是一见很了不起的事,可是现在随便搬出来一台破机器可能就比386要强好几倍,时代在变,效率也要随着时代变。另外要提的重要一点是:教育跟不上时代了`,即使是C语言
加载更多回复(27)

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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