Нацрт C++0x од марта 2010.

From Wikipedia, the free encyclopedia

Remove ads

(у изговору: си плас плас оу екс[1]) је незванични назив новог стандарда програмског језика , који је још увек у развојној фази. Намена му је да замени постојећи стандард за , 14882, који је објављен 1998. и ажуриран 2003. Ове претходнице су неформално познате као и . Нови стандард обухвата неколико додатака у језгру језика и проширује стандардну библиотеку, обухватајући већи део библиотека (). Највероватније ће библиотека специјалних математичких функција бити изузетак. Пошто стандард још увек није завршен, овај чланак можда не осликава ажурно стање , већ нацрт овог међународног стандарда, , који је објављен у марту 2010.

Очекује се да ће комплетирање и објављивање стандарда сачекати крај 2011. године.

Remove ads

Побољшања перформанси током извршавања програма

Наредне карактеристике језика су првенствено направљене да пруже могућност за побољшање рада неког програма. Ово се може тицати уштеде меморије и процесорског времена.

референце и размена меморије међу објектима

референце омогућавају ефикасно премештање садржаја комплексних структура из једне у другу. Нпр. у стандардном -у је могуће да једна функција () оформи низ типа std::vector<T> и врати га функцији која ју је позвала (). У том случају ће низ направљен у прво бити потпуно ископиран у одговарајући низ из , а потом уништен. Копирање и уништавање низа из је сувишан посао, јер ако низ већ постоји у меморији током , нема потребе нити правити његову копију, нити њега брисати. Треба га само на неки начин назад проследити.

У досадашњем -у је било могуће да направи свој низ, и достави га на попуњавање. Од је такође могуће да се низ настао у врати у као референца. У том случају ће повратни тип од бити std::vector<T>&&. Да би овако враћена референца била успешно прихваћена од објекта типа std::vector<T> из , тај тип мора имати дефинисан тзв. конструктор премештања (енгл. ), који преузима све из објекта на кога је добио референцу, и оставља га празним. Уколико овакав конструктор није написан, бива коришћен стари приступ копирања и брисања.

Из безбедносних разлога језик не дозвољава једноставно остављање референци на објекте којима је додељено име. Да би се добила референца на овакав објекат, треба користити шаблон функције std::move<T>().

Генерализоване константне вредности

У стандардном није могуће да се функције, које враћају константну вредност, користе у изразима који морају бити недвосмислено константни још током компајлирања. Овакав израз је нпр. дужина статички дефинисаног низа или садржај енумерација. На пример:

const int DajPet() {return 5;}

int niz[DajPet() + 7]; // Требало би да направи статички низ са
                       // 12 елемената. Не ради у C++.

Ово није могуће у -у, јер се вредност коју функција DajPet() враћа не третира као константа, иако она то у ствари јесте. има нову кључну реч, constexpr, којом програмер може да назначи да нека функција враћа константну вредност:

constexpr int DajPet() {return 5;}

Након ове назнаке, могуће је функцију користити као било коју бројевну константу. Предност оваквог приступа је у томе што оваквим дефинисањем функције њена вредност бива одређивана и употребљавана током компајлирања програма, а не током његовог извршавања, што значи уштеду процесорског времена.

Алтернатива овоме у -у су константни изрази, дефинисани нпр. са:

#define DajPet 5

или

const int DajPet = 5;
Remove ads

Редефинисање -типова

У стандардном -у, структура (struct) мора да испуни бројна правила да би била сматрана за -тип (енгл. ). Добар разлог за постојање што више оваквих типова је компатибилност са -ом. Пошто је списак правила дефинисан у био превише рестриктиван, у се ова правила опуштају.

Сваки тип дефинисан као класа (class) или структура се сматра -типом ако је тривијална, написана према стандардном обрасцу (енгл. ) и ако су све њене енкапсулиране чланице тривијалне.

Класа или структура је тривијална, ако:

  1. Има тривијалан подразумевани конструктор (енгл. ).
  2. Има тривијалан копи-конструктор (енгл. ).
  3. Има тривијалан оператор доделе (енгл. ).
  4. Има тривијалан деструктор (енгл. ), који није виртуелан.

Класа или структура је написана према стандардном обрасцу, ако:

  1. Садржи само нестатичке, елементе, који су такође написани према стандардном обрасцу.
  2. Има иста права приступа (, , ) свим нестатичким чланицама.
  3. Нема виртуелних функција.
  4. Нема виртуелних базних класа.
  5. Све базне класе су јој такође написане према стандардном обрасцу
  6. Нема базних класа истог типа, дефинисане као прве не-статичне чланице.
  7. У целој хијерархији се може наћи само једна класа са нестатичним чланицама. Важи или-или:
    1. Нема базних класа са нестатичним чланицама
    2. Нема нестатичних података у крајње изведеним класама и има највише једну базну класу са нестатичним чланицама.
Remove ads

Побољшања времена компајлирања

У стандардном -у имплементација шаблона бива инстанцирана у свакој јединици програма у којој се користе, што повећава време компајлирања. омогућава да се имплементације шаблона означе као екстерне (речју extern), што означава да ту имплементација не треба инстанцирати у тој јединици, већ је потражити у другој и користити тамошњу инстанцу. Дакле, садашње инстанце шаблона:

template class std::vector<T>;

Би са овим изгледале овако:

extern template class std::vector<T>;

Побољшања употребљивости језика

Ова побољшања су првенствено направљена да би олакшала употребу језика тј. унапређују сигурност руковања типовима, умањују понављање кода, отежавају јављање грешака итд.

Спискови аргумената

Стандардни од -а позајмљује концепт спискова аргумената променљиве дужине (енгл. ). Имплементација овог је захтевала много више кода него нпр. у Јави, и није била примењива на типове који нису одговарали C++03 дефиницији -типова.

уводи нови концепт, код кога се ови спискови аргумената везују за шаблон std::initializer_list.

Нпр, уместо досадашње декларације функције са:

void UzmiNiz(int n, ...);

И извлачења пристиглих аргумената помоћу , и , користи:

void UzmiNiz(std::initializer_list<float> spisak);

При чему променљива садржи подаке о броју променљивих, а позив функције изгледа овако:

UzmiNiz({1.2f, -3.45f, 5.2f});
Remove ads

Референце

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads