C++11

Kohteesta Wikipedia
Loikkaa: valikkoon, hakuun

C++11, (ent. C++0x), on ISO:n 12.8.2011 hyväksymä C++-ohjelmointikielen standardi ISO/IEC 14882:2011.[1] Standardi korvasi edellisen ISO/IEC 14882:1998 standardin (C++98).

Nimessä esiintyvä 11 tulee yleisen nimeämiskäytännön mukaisesti standardin julkaisuvuodesta. C++0x-tunnusta käytettiin työskentelyvaiheessa, koska valmistumisvuodesta ei ollut varmuutta, mutta sen uskottiin valmistuvan ennen vuotta 2010.

Standardin on korvannut C++14 standardi ISO/IEC 14882:2014, joka hyväksyttiin 18. elokuuta 2014.

C++11 lisäsi itse kieleen useita ominaisuuksia sekä laajentaa C++:n standardikirjastoa STL:a. Standardikirjaston laajennos käsittää suurimman osan aikaisemmasta C++ Technical Report 1:stä (TR1). Virallinen standardi on saatavissa ISO:lta korvausta vastaan, mutta viimeinen työskentelyluonnos on saatavilla internetistä ilmaiseksi. Virallisessa standardissa on vain korjattu kirjoitusvirheitä sekä lisätty selvennöksiä.

Muutokset edellisestä standardista[muokkaa | muokkaa wikitekstiä]

Uusi standardi laajentaa varsinaista kieltä sekä sen standardikirjastoa. Pääsuuntaviivat uutta versiota suunniteltaessa olivat:

  • Säilyttää stabiilius sekä yhteensopivuus C++98:n ja mahdollisuuksien mukaan C:n kanssa;
  • Mahdollisuuksien mukaan lisätä uudet ominaisuudet standardikirjastoon itse kieleen lisäämisen sijasta;
  • Tehdä muutoksia, jotka ohjaavat käyttäjää oikeaan toteutustekniikkaan ja -tyyliin;
  • Tukea systeemien ja kirjastojen suunnittelua pelkän uusien ominaisuuksien esittelyn sijaan;
  • Parantaa tyypityksen turvallisuutta tarjoamalla aiemmin turvattomille tekniikoille vaihtoehtoja;
  • Parantaa suorituskykyä ja laitteistorajapinnan kanssa kommunikointia;
  • Tarjota oikeita ratkaisuja reaalimaailman ongelmiin;
  • Toteuttaa niin sanottua "zero-overhead"-periaatetta;
  • Tehdä C++:sta helposti opiskeltava kieli ottamatta kuitenkaan pois ominaisuuksia, joita kokeneemmat ohjelmoijat tarvitsevat;

Aloittelijoiden huomioon ottaminen koettiin tärkeäksi, koska ohjelmoijista suurin osa tulee aina olemaan aloittelijoita, ja koska suurin osa heistä tuskin koskaan tulee perehtymään C++:aan syvällisemmin.

Tyyppiturvallinen nolla-osoitin[muokkaa | muokkaa wikitekstiä]

Kieleen on lisätty tyyppiturvallinen nullptr määrittely.[2][3]

Vanha NULL -makro usein käsitellään int-tyyppinä eikä osoittimena. Vanhempi tapa voi hämmentää ajonaikaista tyyppimekanismia kutsumaan väärää metodia.[3]

Käyttöesimerkki:

int a = 0;
int *p = nullptr;

p = &a;
(*p) = 42;

Vakiolauseke[muokkaa | muokkaa wikitekstiä]

Vakiolauseke (constexpr) määrittää, että lauseke on mahdollista arvioida käännösaikana.[4]

Esimerkki:

const double pi = 3.14;
constexpr double pi_mul(int n) { return n * pi; }

Käyttö olettaa että parametrina annettavat arvot ovat käännösaikana tunnettuja literaaleja. C++14 laajentaa vakiolausekkeen määrittelyä.

Yhdenmukaistettu alustaminen[muokkaa | muokkaa wikitekstiä]

Olioiden alustamista on yhdenmukaistettu muutoksilla määrittelyyn.[5]

Esimerkiksi kolmen alkion vektorin alustaminen arvoilla:

std::vector<float> v = {0.1, 0.2, 1.0};

Anonyyminen vektorin alustaminen ja välittäminen funktiolle:

myfunction( std::vector<float>{0.1, 0.2, 1.0} );

Rajatun alueen toistorakenne[muokkaa | muokkaa wikitekstiä]

Perinteisten C-kielen toistorakenteiden vaihtoehdoksi on lisätty automatisoitu vaihtoehto. Uudempi menetelmä vähentää tyypillisen koodin toistuvaa kirjoittamista.

Tietorakenteissa olevien arvojen käsittelyä voidaan yksinkertaistaa seuraavasti:[6]

std::vector<int> v = {0, 1, 2, 3, 4, 5};
for (auto i : v)
{
     std::cout << i << std::endl;
}

Delegoiva konstruktori[muokkaa | muokkaa wikitekstiä]

Delegoiva konstruktori vähentää ohjelmakoodin toistoa useiden konstruktorien yhteydessä.[7]

class Testi
{
private:
    std::string m_s;
    int m_i;
public:
    Testi(std::string s, int i) : m_s(s), m_i(i) {}
    Testi(int i) : Testi("testi", i) {}
};

Atomiset operaatiot[muokkaa | muokkaa wikitekstiä]

Standardi lisää standardikirjastoon atomisuuden toiminnot.[8][9]

Säikeistyksen tuki[muokkaa | muokkaa wikitekstiä]

Monisäikeistykselle on lisätty alustariippumatonta tukea määrittelyyn. Näin ollen ohjelmakoodin siirtäminen helpottuu vähemmillä muutoksilla.

Standardikirjastossa on std::thread säikeiden luomiseen ja käsittelyyn. Parametrina tälle annetaan funktio-objekti (osoite säikeen suorituksen alkupaikkaan).

Lisäksi thread_local avainsanalla voi määritellä säiekohtaisia muuttujia.

Synkronointitukea on atomisien operaatioiden lisäksi käytettävissä luokilla std::mutex ja std::lock_guard.[10]

Synkronointiin on myös aikarajoitettu std::timed_mutex sekä rekursion salliva std::recursive_mutex ja näiden yhdistelmä std::recursive_timed_mutex.[11]

Tuple-tyyppi[muokkaa | muokkaa wikitekstiä]

Tuple on template-pohjainen vaihtoehto C-kielen struct-tyypille.[12]

typedef std::tuple <int, string, double> tTuple;
tTuple data(42, "heippa", 3.14);

Vastaava tietotyyppi on aiemmin esiintynyt esimerkiksi rinnakkaisohjelmointiiin kehitetyssä Alef -kielessä.[13]

Älyosoittimet[muokkaa | muokkaa wikitekstiä]

Standardikirjastoon on lisätty älyosoittimia eri tarkoituksiin:[14]

Siirto-operaattorit[muokkaa | muokkaa wikitekstiä]

Tyypillisen copy-delete menettelyn sijaan on mahdollista käyttää tehokkaampaa siirto-operaattoria (engl. move):[16]

class MyContainer
{
// ...
MyContainer & operator=(MyContainer && other)
{
    if (this != &other) 
    {
         // ...
    }
    return *this;
}

Menetelmä välttää nk. deep-copy toiminnon, joka voi olla raskas käytössä.

Lähteet[muokkaa | muokkaa wikitekstiä]

  1. ISO/IEC 14882:2011 ISO. Viitattu 25.1.2017.
  2. nullptr, the pointer literal Viitattu 6.2.2017.
  3. a b A name for the null pointer: nullptr (revision 4) Viitattu 6.2.2017.
  4. constexpr specifier Viitattu 6.2.2017.
  5. list initialization Viitattu 6.2.2017.
  6. Range-based for loop Viitattu 6.2.2017.
  7. Constructors and member initializer lists Viitattu 6.2.2017.
  8. Atomic operations library Viitattu 9.2.2017.
  9. C++ Atomic Types and Operations Viitattu 9.2.2017.
  10. std::mutex Viitattu 21.2.2017.
  11. Thread support library Viitattu 21.2.2017.
  12. std::tuple Viitattu 6.2.2017.
  13. Winterbottom, Phil: Alef Language Reference Manual Viitattu 20.2.2017.
  14. Kieras, David: Using C++11’s Smart Pointers Viitattu 6.2.2017.
  15. std::shared_ptr Viitattu 6.2.2017.
  16. Move assignment operator Viitattu 6.2.2017.

Aiheesta muualla[muokkaa | muokkaa wikitekstiä]