Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中使用C样式数组是否有正当理由+;?_C++_Arrays - Fatal编程技术网

C++ 在C+;中使用C样式数组是否有正当理由+;?

C++ 在C+;中使用C样式数组是否有正当理由+;?,c++,arrays,C++,Arrays,在TR1和C++11中的std::vector和std::array之间,动态数组和固定大小数组都有安全的替代方案,它们知道自己的长度,并且不会表现出可怕的指针/数组二元性 P> >我的问题是,C++中是否有任何情况下使用C数组必须< /强>(除了调用C库代码),或者合理地“禁止”它们? 编辑: 谢谢大家的回答,但事实证明这个问题是重复的 所以我会指示大家去那里看看 [我不知道如何结束我自己的问题,但如果主持人(或其他几个有投票权的人)走过,请随意将此标记为dup并删除此句子。]有时现有的代

在TR1和C++11中的
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样式数组是一个很差的选择。这是因为相对于 STD::数组< /代码>,它们很难正确,并且这个困难是开发时的直接开销。这个C++ FAQ条目总结了我对这个问题的想法:

< P>前C++14:在一些中。(罕见)在某些情况下,int等类型的初始化缺失可以显著提高执行速度。特别是如果某些算法在执行过程中需要许多短期数组,并且机器没有足够的内存进行预分配,并且/或者无法首先知道大小,我起初不想回答这个问题,但我已经知道了ING担心这个问题会被C程序员淹没,或者C++写为面向对象的C.P/P。 真正的答案是在习惯C++中几乎没有使用C样式数组的理由。即使使用C样式的代码库,我通常使用向量。这是怎么可能的,你说?好,如果你有向量V和C样式函数需要一个指针传入,你可以通过V[0 ](或者更好的是,V数据)。这是同样的事情)

即使是在性能方面,也很少有人能用C风格的数组作为例子。std::vector确实涉及双重间接寻址,但我相信这通常是经过优化的。如果你不信任编译器(这几乎总是一个糟糕的举动),那么你可以用与上面相同的技术处理v.data()对于std::array,我相信包装器甚至更薄

如果你是一个很棒的程序员,并且你清楚自己为什么要这样做,或者如果一个很棒的程序员看到你的问题并告诉你要这样做,那么你应该只使用一个。如果你不是很棒,并且你使用的是C风格的数组,那么你犯错误的几率很高(但不是100%)

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}
};