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

Где лучше эти переменные объявлять? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Перевод секунд (произвольное целое число) в часы, минуты и секунды http://www.cyberforum.ru/cpp-beginners/thread374630.html
Составить программу, которая будет переводить секунды (произвольное целое число) в часы, минуты и секунды.
C++ сортировка выбором помогите пожалуйста, алгоритм не работает то есть не сортирует #ifndef FUNC #define FUNC #include "vibor.h" #include <vector> #include <algorithm> using namespace std; template<class T> void vibor(vector<T> &v){//сортировка T temp; http://www.cyberforum.ru/cpp-beginners/thread374624.html
C++ Научите писать программы на C++
Привет всем ,начну с того ,что перевелся в универе на информатика на заочке(хочу научиться писать программы,) так как это "мое",зимой сессия ,а помоч и разъяснить не кому вот и пришел к ВАМ ,надеюсь на помощь . Дали задание "Написать программу поэлементного копирования строки «Hello World» в другой символьный массив."Помогите ,пожалуйста и если можете объясните ,что к чему.
Перевод с java на С++ C++
Всем доброго времени суток. Возможно ли перевести код с java на С. Я попробовал сам,начал,но там много того что я не знаю чем заменить в С, потому что толком не понимаю что это обозначает. код не очень большой, половина просто фигни типа вывода,ввода,мат.функций и т.д.. Очень прошу помощи, откликнитесь пожалуйста... package Shenks; import java.math.BigInteger; import...
C++ При наличие корней в системе уравнений выдает ошибку http://www.cyberforum.ru/cpp-beginners/thread374598.html
После выполнения программы (она решает систему линейных уравнений) для случая наличия корней появляется ошибка. Вот код: #include <stdio.h> #include<stdlib.h> #include<time.h> #define N 4 typedef struct {int*a; bool l;//нулевой ли вектор
C++ Builder Сформировать одномерный массив, состоящий из отрицательных элементов заданных матриц Заданы два массива B(10,10), C(10,10). Сформировать одномерный массив D, состоящий из отрицательных элементов заданных массивов. сделала автозаполнение массивов. как дальше???:sigh: void __fastcall TForm1::Button1Click(TObject *Sender) { for(int i=0; i<10; i++) for(int j=0; j<10; j++) StringGrid1->Cells = IntToStr((rand() % 100) - 50); подробнее

Показать сообщение отдельно
Lonely_Romantic
8 / 8 / 1
Регистрация: 13.07.2010
Сообщений: 14
30.10.2011, 01:05     Где лучше эти переменные объявлять?
Ну не совсем без разницы. Тут может быть 2 случая:
1) Если в подпрограмме нет локальных переменных, то выполнится на 1 процессорную инструкцию меньше (вычитание числа - размера памяти для локальных переменных из указателя стека)
2) иначе, если есть другие локальные переменные, тогда действительно без разницы, потому что появление еще одной переменной увеличиват вычитаемое число, а не количество инструкций.

Честно, пока не встречал, чтобы программы на языках высокого уровня оптимизировали вплоть до учета каждой процессорной команды, это скорее относится к языкам ассемблера.

А учат так потому что существуют парадигмы программирования (принципы написания программ на том или ином языке). И обзявление переменных как можно ближе к месту их использования относится к этим требованиям (хотя их вроде и нарушать иногда можно).

p.s. По ходу рассуждения над Вашим вопросом возник другой: есть ли разница по скорости между
C++
1
for (int i; ; )
И
C++
1
2
int i;
for (i; ; );
Если интересно, попробую проверить

Цитата Сообщение от Bers Посмотреть сообщение
Предположим, что переменная i - это не просто int, а экземпляр полноценного класса
Да, наверное. Тут конечно от ситуации зависит. Просто выделить переменную - это быстро, а создавать и разрушать объекты - это уже динамическая память, которая обрабатывается значительно медлеенее, и если можно сократить выделение/освобождение такой памяти, то хорошо.

Добавлено через 1 час 32 минуты
Вынужден Вас огорчить: эксперимент с компиляцией различных вариантов объявления переменной ни к чему хорошему не привел:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <windows.h>
 
class myClass
{
    int x,c,d;
public:
    void math(int a)
    {
        x = 0;
        int b = 0;
        a += 1;
        for (int i = 0; i <= a; i++)
            x += i;
    }
    void print()
    {
        printf("%d\n", x);
    }
};
 
int main()
{
    myClass arr = myClass();
    arr.math(10);
    arr.print();
    return 0;
}
в debug режиме выделяется некий фиксированный объем памяти для локальных переменных, намного превышающий необходимый для 1-2 переменных. И строчки типа
Assembler
1
2
008D14E8   8945 E0          MOV DWORD PTR SS:[EBP-20],EAX
008D14EB   8B45 E0          MOV EAX,DWORD PTR SS:[EBP-20]
явно свидетельствуют о том, что оптимальности тут не было и не будет (debug все-таки)

в release вызов метода явно не представлен: программа скомпилировалась как последовательность команд. Как оно будет выглядеть в более сложных случаях сказать сложно.

Отсюда можно сделать выводы:
1) Отнести выделение памяти для переменных к статическому распределению памяти (оно изначально быстрое) и предоставить работу по оптимизации компилятору.
2) Разделить выделение памяти на статическое и динамическое (более медленное).
Цитата Сообщение от Lonely_Romantic Посмотреть сообщение
создавать и разрушать объекты - это уже динамическая память
исправлюсь: так будет только в случае явного использования операторов new и delete, иначе это та же статическая память, и затраты по времени будут только на иничиализацию объекта. (если, опять же, внутри объекта не исп.динамическая память).

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