C++ 在C+;中使用C样式数组是否有正当理由+;?
在TR1和C++11中的C++ 在C+;中使用C样式数组是否有正当理由+;?,c++,arrays,C++,Arrays,在TR1和C++11中的std::vector和std::array之间,动态数组和固定大小数组都有安全的替代方案,它们知道自己的长度,并且不会表现出可怕的指针/数组二元性 P> >我的问题是,C++中是否有任何情况下使用C数组必须< /强>(除了调用C库代码),或者合理地“禁止”它们? 编辑: 谢谢大家的回答,但事实证明这个问题是重复的 所以我会指示大家去那里看看 [我不知道如何结束我自己的问题,但如果主持人(或其他几个有投票权的人)走过,请随意将此标记为dup并删除此句子。]有时现有的代
std::vector
和std::array
之间,动态数组和固定大小数组都有安全的替代方案,它们知道自己的长度,并且不会表现出可怕的指针/数组二元性
<> P> >我的问题是,C++中是否有任何情况下使用C数组<强>必须< /强>(除了调用C库代码),或者合理地“禁止”它们?
编辑:
谢谢大家的回答,但事实证明这个问题是重复的
所以我会指示大家去那里看看
[我不知道如何结束我自己的问题,但如果主持人(或其他几个有投票权的人)走过,请随意将此标记为dup并删除此句子。]有时现有的代码库会迫使您在技术上使用它们,根据您的使用情况,您可以使用
std::array
或std::vector
重写C样式数组
但是,std::array
本身使用C样式的数组<代码>标准::数组由引擎盖下的C样式数组声明。因此,如果我们想避免编译器魔法,这个数组的存在在某种程度上是必要的
template <class T, int N>
class Array
{
T data[N];
.
.
模板
类数组
{
T数据[N];
.
.
有时在编写小代码时,我更喜欢老式的数组,而不是那些类。
如果您同意编译器扩展,您可以在代码中利用C样式数组的可变长度特性我最后一次需要在新代码中使用它们是在我做嵌入式工作时,标准库没有实现
std::vector
或std::array
。在一些旧代码库中,由于以前的开发人员做出的设计决策,您必须使用数组
在大多数情况下,如果用C++ 11启动一个新的项目,旧的C样式数组是一个很差的选择。这是因为相对于
Foo data[] = {
是一种非常常见的模式。元素可以很容易地添加到其中,并且数据数组的大小会根据添加的元素而增长
使用C++11,您可以使用std::array
:
template<class T, class... Args>
auto make_array( Args&&... args )
-> std::array< T, sizeof...(Args) >
{
return { std::forward<Args>(args)... };
}
同时
auto arr = make_array<Foo>(
{1,2.2},
{3,4.5}
};
这是复制粘贴噪音,可能会妨碍代码的表达
最后,请注意,“hello”
是一个大小为6的常量数组。代码需要知道如何使用C样式数组
<> P>我对这种情况的典型反应是将C样式数组和C++代码> STD::数组< /Calp> S转换成<代码> ARAYYVIEW/CODES>,这是由两个指针组成的范围,并对它们进行操作。这意味着我不在乎是否是基于C或C++语法的数组:我只关心我是由一个数据元素打包的序列。std::dynarray
s和std::vector
s,只需很少的工作量
它确实需要编写一个数组\u视图
,或者从boost
中偷取一个,或者等待它被添加到标准中。C型数组在内存受限(并且严重受限)的嵌入式系统中非常有用
阵列允许在没有动态内存分配的情况下进行编程。动态内存分配会生成碎片内存,并且在运行时的某个时间点,必须对内存进行碎片整理。在安全关键型系统中,碎片整理不能在具有关键定时的时间段内进行
const
阵列允许将数据从宝贵的RAM区域放入只读存储器或闪存中。数据可以直接访问,不需要任何额外的初始化时间,如std::vector或std::array
C型阵列是将原始数据放入程序的方便工具。例如,图像或字体的位图数据。在没有硬盘或闪存驱动器的小型嵌入式系统中,必须直接访问数据。C型阵列允许这样做
编辑1:
另外,std::array不能与不支持C++11或更高版本的编译器一起使用
许多公司不希望在项目启动后切换编译器。而且,他们可能会
auto arr = make_array<Foo>(
{1,2.2},
{3,4.5}
};
auto arr = make_array<Foo>(
Foo{1,2.2},
Foo{3,4.5}
};