静态绑定和Array的动态绑定之间的区别

时间:2011-11-21 02:34:57

标签: c++ arrays dynamic-binding static-binding

我刚刚阅读了关于我现在在stackoverflow中询问的相同主题的所有搜索结果,并没有真正回答我的好奇心。但这就是事情。

问题

1.)据我所知,静态绑定意味着它在编译期间设置,并且它在运行时存在,而动态绑定意味着它在运行时设置。

2.)所以我读的这本书介绍了动态数组,它提到动态数组大小可以在运行时设置。这样就完成了。

守则

int size;
cin >> size;
int * pz = new int [size]; // dynamic binding, size set at run time
delete [] pz; // free memory when finished


3.)在这段代码中,书中提到动态数组大小可以在运行期间设置。出于好奇,我试试这个。

守则

int size;
cin >> size;
int array[size];
//After the array declaraction i assign value to it to check whether it works or not.


4.)上面的代码也有效,所以我只是好奇动态数组有什么特别之处,因为普通静态数组可以做同样的工作。

5.)是因为动态数组可以在运行时释放它的内存而静态不能使它如此特殊吗?


感谢您花时间阅读我的问题,请指出我所犯的任何错误。

3 个答案:

答案 0 :(得分:6)

具有动态大小的静态数组(称为可变长度数组,短VLA)仅适用于编译器中的语言扩展。它是C99的东西,它不包含在C ++标准中,这意味着它不会是便携式的。

另一个明显的区别是你可以将指针传递给其他地方的动态数组,将其保存在某个地方,从函数中返回它,或者换句话说,让它比它在创建的范围更长。你不能用静态数组做到这一点,因为它们在它们的范围结束时被销毁。

答案 1 :(得分:2)

int size;
int array[size];

会抛出编译时失败,说 size不是编译时常量或预期的常量表达式

你声明像这样的数组

int array[5]

const int size = 100;
int array[size];

当您提前了解阵列大小时。

否则,您使用删除[] 方法。我建议完全避免这种结构,而是支持 std :: vector

答案 2 :(得分:1)

早期绑定: - 在翻译过程中,在程序处理早期进行大多数绑定的语言称为早期绑定。
后期绑定: - 语言,后期绑定延迟最多绑定,直到l执行时间。

早期绑定: - 灵活性较差 后期绑定: - 它具有更多编程灵活性。

早期绑定: - 此数据仅在声明数据类型中接受
后期绑定: - 在此变量中可以接受任何类型的数据。

早期绑定: - 检测到正确的分配类型。
延迟绑定: - 在此错误类型的分配右侧未检测到或出错。

早期绑定: - 类型检查必须在编译时完成。
后期绑定: - 类型检查必须在运行时完成。

早期绑定: - 用户编译器或解释器 后期绑定: - 对变量进行后期绑定的语言通常使用纯解释器而不是编译器来实现。