Question

Il en a été de cette réponse à une précédente question de la mienne.Est-il garanti pour le compilateur de traiter array[4][4] le même que array[16]?

Par exemple, seraient soit de la ci-dessous les appels à api_func() être en sécurité?

void api_func(const double matrix[4][4]);

// ...

{
  typedef double Matrix[4][4];

  double* array1 = new double[16];
  double array2[16];

  // ...

  api_func(reinterpret_cast<Matrix&>(array1));
  api_func(reinterpret_cast<Matrix&>(array2));
}
Était-ce utile?

La solution

À partir de la norme C++, en se référant à la sizeof opérateur:

Lorsqu'il est appliqué à un tableau, le résultat est le nombre total d'octets dans le tableau.Ceci implique que la taille d'un tableau de n éléments est n fois la taille d'un élément.

À partir de cela, je dirais que double[4][4] et double[16] devrait avoir la même représentation sous-jacente.

I. e., compte tenu de

sizeof(double[4]) = 4*sizeof(double)

et

sizeof(double[4][4]) = 4*sizeof(double[4])

ensuite, nous avons

sizeof(double[4][4]) = 4*4*sizeof(double) = 16*sizeof(double) = sizeof(double[16])

Je pense que conforme aux normes compilateur pour la mise en œuvre de ces la même chose, et je pense que ce n'est pas quelque chose qu'un compilateur serait casser accidentellement.Le niveau moyen de la mise en œuvre de matrices multi-dimensionnelles fonctionne comme prévu.La rupture de la norme exigerait un travail supplémentaire, pour probablement aucun avantage.

La norme C++ déclare aussi qu'un tableau est constitué de manière contiguë alloué éléments, ce qui élimine la possibilité de faire quelque chose d'étrange à l'aide de pointeurs et de rembourrage.

Autres conseils

Je ne pense pas qu'il y est un problème avec un rembourrage introduit par avoir un multi-dimensionnelle tableau.

Chaque élément dans un tableau doit satisfaire le rembourrage des exigences imposées par l'architecture.Un tableau [N][M] est toujours le même dans la mémoire de la représentation comme l'un des [M*N].

Chaque élément du tableau doivent être disposés de manière séquentielle dans la mémoire par le compilateur.Les deux déclarations, tandis que les différents types sont les mêmes sous-jacents structure de la mémoire.

@Konrad Rudolph:

Je reçois ces deux (ligne principale/colonne principale) de mélange moi-même, mais je sais ceci:Elle est bien définie.

int x[3][5], par exemple, est un tableau de taille 3, dont les éléments sont de type int tableaux de taille 5.(§6.5.2.1) l'Ajout de toutes les règles de la norme sur les tableaux, l'adressage, etc.vous obtenez ce que le deuxième indice références nombres entiers consécutifs, wheras le premier indice de référence consécutives 5-int objets.(Donc 3 est le plus grand nombre;vous avez 5 ints entre x[1][0] et x[2][0].)

Je serais inquiet à propos de rembourrage ajoutée pour des choses comme la Matrice[5][5] pour faire de chaque ligne mot aligné, mais qui pourrait être tout simplement mon propre superstition.

Une grande question est:avez-vous vraiment besoin pour effectuer un tel casting?

Bien que vous peut être en mesure de sortir avec elle, il serait tout de même plus lisible et maintenable pour éviter tout à fait.Par exemple, vous pouvez utiliser régulièrement le double[m*n] comme le type réel, et ensuite travailler avec une classe qui encapsule ce type, et peut-être les surcharges de l'opérateur [] pour la facilité d'utilisation.Dans ce cas, vous pourriez aussi avoir besoin d'une classe intermédiaire pour encapsuler une seule ligne, de sorte que le code comme my_matrix[3][5] fonctionne toujours comme prévu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top