-1
votes

Taille de la classe avec int et taille de la classe avec int dans une fonction

J'apprends à propos de C ++ et de programmation orientée objet. Passez un petit doute -

class CA 
{
    void fun()
    {
        int x;
    }
};

class CB
{
int y;
};

int main()
{
    CA obj;
    CB obj1;
    cout<<sizeof(obj)<<'\t'<<sizeof(obj1);
}


9 commentaires

"Les deux classes ont des entiers" - non, ils ne le font pas. La fonction amusante () a un entier, créé chaque fois que la fonction est appelée, mais cela ne fait pas partie de la classe.


x ne fait pas partie de ca . Il n'existe pas, sauf lorsque vous exécutez amusant , il n'a pas de stockage en dehors de ce contexte.


Je vous suggère de lire un bon livre sur C ++. La liste commune peut être trouvée ici:


@Sergeya. Pourrait être une réponse en stock pour toute question sur la pile débordement: je vous suggère de lire un bon livre sur [Tag].


@Bathsheba pas vraiment. Mais lorsque la question est très large et basique, il est difficile de ne pas voir que l'OP manque de concepts fondamentaux de la langue qui serait difficile à expliquer au format de dépassement de pile. En particulier la différence entre les membres de la classe de classe et les variables locales d'une fonction.


@Sergeya: Celui-ci transmet mon seuil de décence - le fait que la taille minimale est 1 est enterrée assez profonde.


@Bathsheba J'accepterais certainement la question de pourquoi la taille de la classe avec aucun membre n'est 1 (pas 0) (évidente d'un duplicata). Mais dans ce cas, OP ne parvient pas à voir la différence entre les membres de données et la variable de fonction locale ... sur un tarif, nous pourrions avoir une différence d'opinions ici.


@Sergeya: Oui, nous ferions probablement mieux de partir là-bas; Je vais ouvrir une bouteille de Malbec. Passez une bonne soirée!


@Bathsheba accueille!


4 Réponses :


3
votes

ca n'a pas de variables de membre. (Une fonction virtuelle tel que amusant et tout ce qui pourrait contenir ne contribue pas à la taille d'une instance d'une classe.) Mais Tailleof (CA) ne peut pas être zéro car sinon le pointeur arithmétique briserait horriblement sur un tableau de ca objets! Donc, votre compilateur choisit une valeur minimale. 1 est autorisé car ce n'est pas plus petit que Tailleof (Char) .

La taille de cb est borné par la taille d'un int ; Cela pourrait être supérieur à celui dû à le rembourrage .


5 commentaires

Il n'y a aucune raison de garnir la classe ayant un seul int.


@Sergeya: dit qui? Methinks MSVC peut commencer à le faire sous Windows sous forme de bus x64 Evoluer et ils collent avec un int pour la compatibilité en arrière!


Pas sûr de suivre. Pouvez-vous s'il vous plaît élaborer pourquoi 32 bits intves devront être rembourrés lorsqu'ils sont à l'intérieur d'une classe? Apparemment, ils travailleraient bien avec ces bus évolués quand ils sont seuls? Quelle différence la classe ferait-elle la classe?


@ Sergeyya: Je n'ai plus accès à un tel compilateur, mais je pense l'un des compilateurs de Borland avec un int IT dans un struct . Quoi qu'il en soit, mon point reste, il pourrait encore plus grand.


Borland Quoi? : D Je n'ai jamais eu de bonne opinion sur leur logiciel, c'est pourquoi nous avions l'habitude de les appeler des punaises. Leurs optimiseurs m'ont frappé une ou deux fois, si je me souviens bien.



1
votes

Vous pouvez utiliser CB pour stocker une valeur. C'est pourquoi les objets de cette classe ont une taille supplémentaire.

CA a;
a ... // what would you put there ?


3 commentaires

Bit trompeur avec la "pile". CB La variable de membre 'S peut être "sur la pile". Préfère la terminologie C ++.


Tu es absolument juste. Pouvez-vous suggérer une modification, car la terminologie n'est pas ma forte.


Hmm, lutte pour trouver une solution rapide à cette phrase tbh.



2
votes

La variable x à l'intérieur de la fonction xxx

n'est pas un membre de données de la classe. C'est une variable locale de la fonction qui n'est pas vivante en dehors de la fonction. La classe n'a pas de membres de données.

La taille d'un objet complet (ou de classe) ne peut pas être égal à 0. Donc, le compilateur le définit à 1.

dans le second cas, la variable y < / code> est un élément de données de la classe xxx

fais attention à cela si dans le second cas, vous déclarerez un élément de données statique au lieu de l'élément non statique comme < / p> xxx

puis l'élément statique ne constitue pas la taille de la classe ou un objet de la classe. Les membres statiques de données sont définis (généralement) en dehors des classes. Au sein de la classe, une déclaration du membre statique n'est pas sa définition. Encore une fois, le programme produira 1 pour un objet d'une telle classe.


3 commentaires

Notez que statique int x dans amusant ne compte pas non plus, malgré l'être, dans un sens vivant en dehors de la fonction. Vous êtes normalement plus complet que ce vlad!


@Bathsheba C'est en tout cas une variable locale de la fonction.


@Bathsheba Vous avez fait exactement la même chose dans votre propre réponse.



0
votes
  1. Vous voyez, l'extrait que vous avez fourni dans votre question a deux classes à savoir, à savoir ca strong> et cb fort>. li>.
    class CA 
    {
        void fun()
        {
            int x;
        }
    };
    

0 commentaires