Page 2 of 2 First 12

Thread: Q: C++ loops

  1. #16
    Unzip Attack's Avatar
    Registered
    09/08/02
    Location
    Hasselt
    Posts
    239
    iTrader
    4 (100%)
    Mentioned
    0 Post(s)
    Reputation
    0/0
    Quote Originally Posted by Silenger.BE
    This quote is hidden because you are ignoring this member. Show
    Het gebruik van for en while is afhankelijk van de toepassing, maar meestal kan je ze onderling omwisselen.

    Code:
    for(int i = 0; i < 5; i++)
    {
    zal beter zijn dan wanner je vb dit doet,
    
    
    Code:
    int i = 0;
    
    }
    while(i < 5) { <doe iets> i++; }
    bij de for loop zal de compiler direct weten dat i alleen tijdens de loop moet gebruikt worden en mag dan bv gewoon ecx register (register die gebruikt bij x86 om het antaal herhaling duidelijk te maken aan de processor) zijn.
    anders zou het kunnen dat hij bij de while zelf i op de stack allocate, maar dat zal hopelijk niet gebeuren.

    true true, maar wil je platform onafhankelijke code moet je die "int i = 0" BUITEN de for lus houden...
    no votes  

  2. #17

    Registered
    13/11/04
    Posts
    62
    iTrader
    0
    Mentioned
    0 Post(s)
    huh? is da ni gewoon onderdeel van gestandaardiseerde C++? is da echt afhankelijk van uw platform?
    no votes  

  3. #18

    Registered
    30/07/03
    Posts
    626
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/0
    Bij de meeste compilers kan je dit doen:

    Code:
    for (int i=0; i<max; ++i)
    {
    // eerste lus
    }
    
    for (int i=0; i<max; ++i)
    {
    // tweede lus
    }
    Maar bij andere compilers kan dat een error geven omdat die compiler "i" twee keer in dezelfde scope gedeclareerd ziet. Ik weet niet 100% zeker wat standaard is, maar ik denk dat bovenstaande code standaard is (vermits GCC dat toelaat).
    [LifeIsDigital.net] - Mijn artikels, open source software en projecten!
    no votes  

  4. #19

    Registered
    13/11/04
    Posts
    62
    iTrader
    0
    Mentioned
    0 Post(s)
    aah, de VC++ 6.0 bug dus

    nu ja, kzet mn for loop altijd nog es apart tussen haakskes om zo'n dingen te voorkomen
    no votes  

  5. #20
    S3cT0r's Avatar
    Registered
    09/03/03
    Location
    Kruibeke
    Posts
    111
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/0
    Bij mij geeft het altijd errors als ik de var declare in de for loop, daarom:

    Code:
    register int i;
    
    for (i = 0;i < 10;i++) {
       code;
    }
    
    for (i = 0;i < 10;i++) {
       code;
    }
    ...
    Grote kans dat de compiler de "i" in de register steekt dan, dit is vooral handig bij enorme loops, niet zoals in het voorbeeld dus.
    no votes  

  6. #21

    Registered
    30/09/02
    Location
    Mariakerke
    Posts
    554
    iTrader
    1 (100%)
    Mentioned
    0 Post(s)
    Reputation
    2/2
    Quote Originally Posted by S3cT0r
    This quote is hidden because you are ignoring this member. Show
    Bij mij geeft het altijd errors als ik de var declare in de for loop, daarom:

    Code:
    register int i;
    
    for (i = 0;i < 10;i++) {
       code;
    }
    
    for (i = 0;i < 10;i++) {
       code;
    }
    ...
    Grote kans dat de compiler de "i" in de register steekt dan, dit is vooral handig bij enorme loops, niet zoals in het voorbeeld dus.
    Kheb me ooit eens laten wijsmaken dat het gebruik van het keyword register af te raden is. Het is beter de compiler te laten beslissen wat in het register moet en wat niet.
    En met die code die hier staat, is uw i wel globaal gedeclareerd, waardoor ge die gans de rest van uw programma meesleept, terwijl em enkel moet gekend zijn in de lussen. (en ge offert er hier nog es een register plaats voor op ook, dus ik betwijfel of dit een goede oplossing is)
    no votes  

  7. #22
    wlibaers's Avatar
    Registered
    18/07/02
    Posts
    2,279
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/0
    Quote Originally Posted by Vich
    This quote is hidden because you are ignoring this member. Show
    Bij de meeste compilers kan je dit doen:

    Code:
    for (int i=0; i<max; ++i)
    {
    // eerste lus
    }
    
    for (int i=0; i<max; ++i)
    {
    // tweede lus
    }
    Maar bij andere compilers kan dat een error geven omdat die compiler "i" twee keer in dezelfde scope gedeclareerd ziet. Ik weet niet 100% zeker wat standaard is, maar ik denk dat bovenstaande code standaard is (vermits GCC dat toelaat).
    In een standaard C++ compiler zitten die twee niet in dezelfde scope, en is de eerste i niet meer bereikbaar nadat de loop gedaan is. In bepaalde C++ compilers die de standaard op dit punt niet volgen (vooral bepaalde MSVC versies, je kan sommige versies wel met een commandline optie correct laten werken, maar MFC eist de incorrecte werking) blijft de i wel in scope na het einde van de loop.



    Quote Originally Posted by Krueger
    This quote is hidden because you are ignoring this member. Show
    Kheb me ooit eens laten wijsmaken dat het gebruik van het keyword register af te raden is. Het is beter de compiler te laten beslissen wat in het register moet en wat niet.
    En met die code die hier staat, is uw i wel globaal gedeclareerd, waardoor ge die gans de rest van uw programma meesleept, terwijl em enkel moet gekend zijn in de lussen. (en ge offert er hier nog es een register plaats voor op ook, dus ik betwijfel of dit een goede oplossing is)
    Voor de standaard maakt register niet veel uit. Storage class register is bijna equivalent met auto, met het verschil dat je van een variabele met storage class register het adres niet kan nemen. Voor de rest mag een compiler van de standaard (C99, ik heb de C++ standaard hier niet liggen) "register" negeren. Vele compilers zullen het wel als een hint beschouwen dat je snel toegang tot dat ding wil, maar er is geen enkele garantie dat die variabele ook echt z'n eigen register krijgt. En inderdaad, in eerste instantie is het beter dit niet te gebruiken, later kan je nog altijd wat proberen als het te traag gaat.

    Niet dat het veel zal uitmaken, want als die variabele echt veel gebruikt wordt zal de compiler waarschijnlijk zelf al het initiatief nemen om er vooral een register voor te gebruiken.
    Last edited by wlibaers; 28-03-2005 at 15:29.
    "If you have a right to respect, that means other people don't have a right to their own opinions."
    Thomas Sowell
    no votes  

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

Log in

Log in