Почему отличается скорость выполнения функции в классе и вне его?
Интересная ситуация получилась. Есть функция которая динамически создает кнопочки, панельки и т.д. и выкладывает их на форму. Скорость, в принципе, приличная. Но вот когда я завернул это же функцию (без изменений) в свой класс, то начались страшные тормоза. Скорость создания упала практически в два раза! Вопрос: Почему?
Вообще, класс - это структура (условно говоря). Обращение к функции экземпляра класса есть обращение к члену структуры. Ещё дольше, если функция виртуальная. Но тем не менее, само по себе это не слишком много времени отнимает, если, конечно, не пытаться вызывать функцию (создающую за один вызов один контрол) в цикле несколько десятков раз.
Это я утрировано, конечно, написал. Приведите пример своего кода, может что ещё люди подскажут.
Вообще, класс - это структура (условно говоря). Обращение к функции экземпляра класса есть обращение к члену структуры. Ещё дольше, если функция виртуальная. Но тем не менее, само по себе это не слишком много времени отнимает, если, конечно, не пытаться вызывать функцию (создающую за один вызов один контрол) в цикле несколько десятков раз.
Это я утрировано, конечно, написал. Приведите пример своего кода, может что ещё люди подскажут.
Функция вызывается один раз и создает несколько десятков контролов. Может быть скорость падает из-за того, что я их все храню в TObjectList?
Функция вызывается один раз и создает несколько десятков контролов. Может быть скорость падает из-за того, что я их все храню в TObjectList?
Если они и прежеде, когда функция была свободная, хранились там же, то вряд ли. Хотя, TObjectList я не использую никода. Пользуюсь std-контейнерами, просто по привычке.
Если они и прежеде, когда функция была свободная, хранились там же, то вряд ли. Хотя, TObjectList я не использую никода. Пользуюсь std-контейнерами, просто по привычке.
Нашел решение проблемы. Я все контролы выкладываю на TPanel (тоже создается динамически) и в начале цикла делаю панель невидимой, а после того как все контролы созданы - показываю её. Происходит все практически мгновенно. :-) Хотя в обычной функции (вне класса) панель была видимой всегда.
Но все равно остается неясным почему в классе скорость упала. !?
Спасибо fellow за отклик. ;-)
Вообще, класс - это структура (условно говоря). Обращение к функции экземпляра класса есть обращение к члену структуры.
Не верно.
Методы не храняться в экземпляре класса, как данные.
Вызов самостоятельного метода от метода-члена (не виртуального) отличается только тем, что при вызове метода-члена в него передается еще один аргумент - указатель на экземпляр класса (this). Обычно этот аргумент передается через регистр ECX, это зависит от компилятора.