2013-07-03 5 views
3

J'essaie de comprendre la différence dans un ABI (disons pour le système V) et le standard C++. Ainsi, la norme C++ détermine simplement le C++ légal, de sorte qu'un compilateur peut le transformer en un code d'assemblage adéquat. L'ABI régule alors comment ce code d'assemblage interagit avec l'architecture x86? Est-ce la comparaison de niveau supérieur entre les deux?ABI vs C++ Standard

La raison pour laquelle je demande est que, étant intéressé par un logiciel à faible latence, je me demande quelle serait la valeur de la lecture de l'ABI?

+0

duplication possible de [Que pourrait C/C++ "perdre" si elles ont défini un ABI standard?] (Http://stackoverflow.com/questions/2083060/what-could-cc-lose-if-they-defined- a-standard-abi) – duDE

+0

Il existe * un * standard C++, il y a * beaucoup * d'ABI et d'architectures de processeurs. Évitez de faire des comparaisons. –

+0

@HansPassant Tout le point de ma question est de faire une comparaison ?! Quel est le but de l'ABI, comment est-ce différent? – user997112

Répondre

5

La norme définit ce qu'un programme doit faire en fonction du code que vous écrivez. L'ABI définit comment cela est implémenté pour une plate-forme particulière afin que le code compilé dans différentes exécutions (éventuellement par différents compilateurs/version) puisse interagir.

C'est, lorsque vous écrivez:

void f(int i) { std::cout << i; } 

La norme définit le comportement: un appel à cette fonction provoque l'impression de la valeur de l'argument. L'ABI détermine comment l'assembly est généré pour que la fonction puisse être appelée (comment est le nom de f?) L'argument peut être passé (l'argument sera-t-il quelque part dans la pile? Dans un registre?). En ce qui concerne la partie en gras de la question ... eh bien, cela dépend. Les ABI sont des lectures lourdes, et il est difficile de les lire et de les comprendre. Mais vous devriez au moins être familier avec certaines des bases, comme calling conventions (quel est le coût de passage d'un objet de type T?) ... Au-delà, je ferais une approche réactive: profil et si vous avez besoin de comprendre ce que est en cours, l'ABI pourrait aider.

La plupart des programmeurs ne connaissent pas l'ABI pour leur plate-forme et ils vivent aussi heureux. J'ai surtout fait plusieurs allers-retours pour comprendre certaines particularités du comportement des programmes.

4

Pour votre question directe: Comprendre l'ABI vous aidera dans une certaine mesure. Mais l'ABI ne vous dira pas ce qui est efficace dans une application C++ particulière en tant que telle - par exemple, l'effet de l'utilisation de l'inline - qui peut être bénéfique et préjudiciable. De même, le choix d'utiliser vector par rapport au tableau de style C peut être bénéfique dans certains cas, mais dans d'autres cas, cela fait si peu de différence que cela ne vaut pas la peine de passer de l'un à l'autre.

Un logiciel à faible latence consiste beaucoup plus à comprendre ce que le compilateur fait EN GÉNÉRAL avec un code particulier qu'à savoir exactement ce que le paragraphe 13.6.2 de l'ABI dit sur la façon dont la VTABLE est organisée - à moins bien sûr que le code particulier que vous compilez est directement affecté par la mise en page VTABLE - la plupart du temps ce n'est pas un problème (au-delà de la compréhension qu'une fonction virtuelle est un appel indirect, qui peut être un peu plus lent que l'appel direct correspondant Vous pouvez vous soucier de choses comme "Combien de registres sont utilisés pour transmettre des arguments", mais sachant si le compilateur utilise R0, R1, R2 ou R13, R14 et bien plus que la version inline de la fonction. R15 comme les trois re gisters pour passer des arguments est beaucoup moins important. Et surtout, peu importe combien vous PENSEZ comprendre ce que fait le compilateur, en regardant la sortie de l'assembleur, en exécutant le code à travers un profileur, etc., vous en apprendrez BEAUCOUP plus que de lire la spécification ABI. Rappelez-vous que dans le code typique, 90% du temps est passé dans 10% du code. La fixation de la "lenteur" d'une fonction qui utilise 0,001% du temps d'exécution total est probablement un effort inutile.

+0

Bonjour. Vous avez dit "le choix d'utiliser le vecteur par rapport au tableau de style C peut être bénéfique dans certains cas". Si vous parliez de latence, vouliez-vous dire l'inverse? Tableau de style C plutôt que vecteur? Le vecteur ne peut pas être plus rapide dans n'importe quel scénario peut-il? – user997112

+0

Oui, je voulais dire que certaines tableaux C sont un peu plus rapides que les vecteurs. Mais mon point principal est que parfois il y a une grande différence, à d'autres moments il n'y a aucune différence, et si vous avez vraiment besoin de stockage dynamique (et donc, votre tableau est en fait un pointeur), ou vous passez le tableau dans un pointeur), le bénéfice peut disparaître complètement. –

+0

Je suis tout à fait d'accord - c'était juste agréable de savoir qu'il y a quelque part qui détaille le fait que Linux passe plus de paramètres via les registres que la pile et je me demandais quel autre "trésor d'or" était enterré dans l'ABI. – user997112