45 votes

Pourquoi tant d'exécution de la taille des tableaux et des std::dynarray en C++14?

Projet de C++14 comprend à la fois à l'exécution, la taille des tableaux et de l' std::dynarray conteneur. À partir de ce que je peux dire, la seule vraie différence entre les deux est que l' std::dynarray a une interface STL (par exemple, begin, end, size, etc.), pendant l'exécution, la taille des matrices de ne pas. Alors, pourquoi est-ce que C++14 besoin des deux?

Je comprends que l'exécution de la taille des tableaux font partie de la base de la langue, tandis que d' std::dynarray fait partie de la bibliothèque standard, mais la proposition d' std::dynarray rend clair le fait que les auteurs s'attendent à des compilateurs, dans de nombreux cas, d'offrir un soutien spécial pour l' std::dynarray , de sorte qu'il peut être aussi efficace que possible, c'est à dire, aussi efficace qu'un moteur d'exécution tableau de taille. En tant que tel, de la langue et de la bibliothèque distinction semble quelque peu artificielle.

Donc, encore une fois, pourquoi est-ce que C++14 besoin à la fois de l'exécution, la taille des tableaux et std::dynarray? Et étant donné que l' std::dynarray est plus riche (STLified) de l'interface, pourquoi ne pas les déposer à l'exécution, la taille des tableaux, en supposant qu' std::dynarray peut être mis en œuvre avec l'égalité d'exécution de l'efficacité?

Précisions

Quand je parle de "exécution de la taille des tableaux," je suis se référant à un nouveau C++14 langage de base fonctionnalité décrite dans N3639, pas à la traditionnelle C des tableaux ou VLAs ou quoi que ce soit en C++11.

32voto

Yakk Points 31636

N3639 propose d'ajouter locaux d'exécution de la taille des tableaux avec automatique de la durée de stockage de C++.

N2648 dit qu'en accord avec C++ pratique, std::dynarrays sont utilisables avec plus que des variables automatiques. Mais pour profiter de l'efficacité de l'allocation de pile, nous souhaitons faire dynarray optimisable lorsqu'il est utilisé comme une variable automatique.

En bref, C11 style d'exécution de la taille des tableaux sont limités à être stockées sur la pile. dynarray n'est pas, mais peut être optimisé lorsque stockés sur la pile pour être aussi efficace que C11 style d'exécution de la taille des tableaux (ou alors c'est le but).

C11 style d'exécution de la taille des tableaux peut être utile pour la syntaxe, et le coût d'augmentation de intercompilability avec C n'est pas élevé: le mécanisme doit être mis en œuvre efficace de l'automatique dynarray de toute façon. En outre, C11 style d'exécution de la taille des tableaux sont de première classe des citoyens, et existe indépendamment de l'utilisation de std des bibliothèques par le programmeur.

Il existe des différences importantes entre les résultats réels C11 exécution de la taille des tableaux et C++1y C11-style d'exécution de la taille des tableaux, dont le moindre est le runtime sizeof réel C11 exécution de la taille des matrices de soutien. Mais l'utilisation de base, il peut être compatible.

2voto

sasha.sochka Points 4937

Comme vous l'avez dit vous-même - std::dynarray fournira STL-interface de style, ce qui rend plus idiomatiques à utiliser. Encore, C++ besoins tableaux dynamiques créé avec new[] à la:

  1. au moins mettre en oeuvre std::dynarray (de sorte que vous ne pouvez pas avoir dynarray sans [nouveau])
  2. de conserver la compatibilité avec les versions précédentes

Vous ne pouvez pas dire que tout le code, qui utilise de nouveaux[] est maintenant mal.

En général, la différence entre le C++14 std::dynarray et C++ new[] tableau est presque la même que la différence entre le C++11 std::array et de style C tableaux.

UPD: Maintenant, je vois que vous êtes maintenant poser des questions sur une fonctionnalité similaire à C11 (VLA l'). En fait il n'y a rien à faire avec elle - VLA sont très limitées et vous ne pouvez utiliser qu'un argument de la fonction en tant que votre taille de la matrice. Aussi, la mémoire est allouée sur la pile, mais pour l' std::dynarray de la mémoire est allouée dans le tas. En gros, cette fonction juste s'étend de style C des tableaux un peu plus et fait de C++ un peu plus compatible avec moderne C standard.

2voto

aaronman Points 8034

Je pense que vous avez répondu à la question vous-même, std::dynarray a l'interface stl. L'objectif de c++11 et je suppose que c++14 est de faire de c++ plus convivial, moins d'erreurs et plus facile pour les débutants. Avec c le style des tableaux vous pouvez exécuter dans l'arithmétique des pointeurs de problèmes, mais dynarray permet d'éviter les problèmes en cas d'utilisation conforme
EDIT: de sorte qu'il ressemble à une différence est qu'à l'exécution, la taille des tableaux doit être alloué sur la pile, l'augmentation de la probabilité d'un dépassement de pile. dynarray est alloué sur le tas si il est possible d'allouer sur la pile (si la mise en œuvre a fait)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X