Форум программистов, компьютерный форум CyberForum.ru

Соптимизирует ли (любой) компилятор такой код? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Решение задачи на С++ с техстовыми файлами http://www.cyberforum.ru/cpp-beginners/thread656852.html
Помогите решить задачу. Даны два входных текстовых файла. Сформируйте выходной файл, вставив в первый входной файл содержимое второго входного файла с указанной позиции. Если вставка невозможна, выдайте об этом сообщение.
C++ Построение односвязного списка Имеется следующая функция считывающая структуру из файла и создающая односвязный список. Проблема в том, что если в файле > 1 э-та - список строиться не правильно. Т.е первый э-т правильно встаёт на head, а остальные - встают хз куда=>после этого прога рушиться(потому-что нельзя добавить э-ты в список) т.к. он не правильно построен после считывания из файла. void readFromFile() {... http://www.cyberforum.ru/cpp-beginners/thread656847.html
C++ Поиск подстроки в строке с русскими и английскими буквами. strstr() не справляется
Писал программку для отправки в инвиз окна, не работает поиск окна по заголовку, если в заголовке есть русские буквы. Пробовал разные комбинации AnsiToChar(), CharToAnsi(), CharToOem(), SetLocale() - не справился. Помогите пожалуйста. Вот код #include <windows.h> #include <stdio.h> #include <conio.h> #include <iostream.h> struct string{char el;}; int counter = 0; TCHAR head2;
Освобождение и выделение памяти C++
Помогите разобраться с программой, где здесь выделение памяти (как я понял это new) и где освобождение памяти. #include <iostream> #include <conio.h> using namespace std; struct train { char name; char number;
C++ Работа с файлами. С++ http://www.cyberforum.ru/cpp-beginners/thread656832.html
Доброго времени суток. В программировании полный ноль. Мог бы мне кто нибудь, объяснить как вывести из файла определенную (часть из общей) информацию и записать ее в отдельный. То есть есть файл , в котором под пунктом 1) есть информация и под пунктом 2) тоже . Необходимо что бы она выводилось на выбор , либо из пункта 1) , либо - 2). Вывести всю информацию из файла , труда у меня не...
C++ вещественный массив Здравствуйте возникла проблема, как сделать массив с вещественными числами, заменяя на float и double возникают ошибки,помогите разобраться #include "stdafx.h" #include"iostream" #include<conio.h> #include<stdlib.h> #include<time.h> #include <iomanip> using namespace std; подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,139
Записей в блоге: 26
24.09.2012, 00:13     Соптимизирует ли (любой) компилятор такой код?
Никаких дополнительных накладных расходов на "создание" переменной внутри цикла нет. AzaKendler уже как-то задавался похожим вопросом. Там всё шло без привязки к лексическим блокам и т.п., но суть в общем-то одна и та же. Далее кидаю ссылки с моими ответами, где основная суть, ну полезно прочитать всю тему, хоть там и много букв

[C++] Взятие адреса конструктора. Физическое время существование объекта.
[C++] Взятие адреса конструктора. Физическое время существование объекта.
[C++] Взятие адреса конструктора. Физическое время существование объекта.

Добавлено через 48 минут
Кстати, по поводу локализации переменных в блоки. Возьмём пример, когда переменные объявляются вне блоков:

C
void func (void)
{
  int x, y;
  ...
  {
    /* "x" используем только в данном блоке */
  }
  ...
  {
    /* "y" используем только в данном блоке */
  }
  ...
}
В этом примере будет отведено две ячейки памяти под переменные x и y.

А если рассмотреть случай с объявлением переменных внутри блоков:

C
void func (void)
{
  ...
  {
    int x;
    ...
  }
  ...
  {
    int y;
    ...
  }
  ...
}
то в этом случае по достижении закрывающей фигурной скобки первого блока компилятор освободит ячейку памяти, отведённую под переменную "x", а по достижении открывающей фигурной скобки второго блока эту ячейку памяти переиспользует для переменной "y". Таким образом мы имеем две локальные переменные, про которые программист явно указал, что их времена жизни не пересекаются, а потому компилятор использует для них одну и ту же ячейку памяти

Однако современные компиляторы в реальности даже в первом примере для переменных "x" и "y" сумеют заиспользовать одну и ту же ячейку памяти или регистр. Потому как оптимизации в современных компиляторах довольно-таки умные. Но скорее всего будет ряд сложных случаев, когда компилятор не сумеет с этим справиться. В основном это касается случаев, когда аггрегатные переменные (массивы, структуры, классы) распределены в память. Из-за того, что при работе с полями идёт сложная работа с разными подчастями переменной, то полноценный анализ кода компилятором оказывается дорогим с точки зрения времени компиляции и потребляемой компилятором памяти. Поэтому такие анализы в компиляторах сильно упрощают.

Как итог можно сказать следующее. Если время жизни переменной реально ограничивается каким-то лексическим блоком, то переменную лучше объявить в блоке. Помимо того, что это улучшает читаемость кода, это упрощает работу компилятора, а потому в каких-то случаях (особенно после того, как сделали много inline-подстановок) это может положительно повлиять на скорость кода. Навскидку мне кажется, что для Си++ эффект будет больше, чем для Си, потому как в Си++ львиная доля библиотечной поддержки реализована в виде коротеньких шаблонных функций или inline-методов, а потому из-за массового inline код отдельно взятой процедуры становится сложным
 
Текущее время: 16:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru