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

реализация класса в .h файле хорошо или плохо? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Ошибка с полем в классе http://www.cyberforum.ru/cpp-beginners/thread939514.html
Пишу класс.Сюда его выкладывать не хочу,ибо он достаточно обширный.В классе доступе private задаю поле дескриптора файла.Тоесть что-то типо того: Class Myclass { private: HANDLE file; ... public: ... };
C++ Сообщения между win32 приложениями Как отправить сообщение (аналог системных типа WM_DESTROY только свои) и обработать приемником? приёмник это обычное консольное win32 приложение(когда в визуале пустой проект win32 создаешь) http://www.cyberforum.ru/cpp-beginners/thread939505.html
Как назвать классы? C++
Сразу замечу, что дело происходит в 2D без физики, как таковой. 1) У меня есть классы: Mixer - звуковой движок Graphics - графический движок У звукового движка есть базовый класс: MixerPrimitiveType (некоторая инфа для воспроизведения) от которого наследюутся:
C++ Не удается подключить к приложению gtest и свою статическую либу VS 2010
Здравствуйте, господа. Возникла проблема с линкером в VS 2010 после подключения к консольному приложению собственной же статической библиотеки. В солюшене 2 проекта: 1 - статическая библиотека, 2 - приложение для тестов её функций, к этому приложению подключен gtest через его статическую либу. В 1-м проекте статической библиотеки имеется h-ник с API этой либы. Так как API может оперировать...
C++ Консоль для ведения логов http://www.cyberforum.ru/cpp-beginners/thread939483.html
Не уверен, что пишу туда, куда нужно, но есть только один способ узнать. Интересуют существующие решения по сабжу. Требования простые: - Минимум зависимостей - Цветной текст и фон - Динамические фильтры записей - Много буков - Желательно, отдельный поток и кеширование на диск - Картинки и ссылки приветствуются
C++ Крутящееся колесо Может ли кто написать (срочно) программу крутящееся колесо, исходник чтобы был с комментариями. подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
20.08.2013, 14:06     реализация класса в .h файле хорошо или плохо?
Цитата Сообщение от Убежденный Посмотреть сообщение
Эффект от -fno-inline более глубокий, чем ты описываешь - он отключает инлайнинг по всему коду
Да, отключает. Но очень много всего в нашем случае некритично, ибо будет составлять проценты, может десятки процентов. В нашем случае речь шла о разнице более, чем на порядок, а потому всеми этими процентами и десятками процентов можно пренебречь. Во всяком случае для меня это очевидно (т.к. есть опыт в этой области). Но это вовсе не означает, что это так же очевидно тебе и другим. Поэтому привожу обещанный ранее пример. В примере у нас имеются элементы Elem и массив Elem'ов. Создаём массив, инициализируем его, затем инкрементируем значения

========== Реализация методов в хидере ==========

C++
// Файл t1.cc
 
#include "t.h"
 
#define SIZE 10000
#define COUNT 100000
 
/* Атрибут втыкаем для того, чтобы отрезаться от цикловых оптимизаций
 * вточке вызова и замерить условно чистое время работы данной функции */
void __attribute__((noinline))
test_func (void)
{
  Array array (SIZE);
 
  for (int i = 0; i < SIZE; i++)
    {
      Elem elem (i);
      array.Set (i, elem);
    }
 
  for (int i = 0; i < SIZE; i++)
    {
      Elem elem = array.Get (i);
      elem.Set (elem.Get() + 1);
      array.Set (i, elem);
    }
}
 
int
main (void)
{
  for (int i = 0; i < COUNT; i++)
    test_func ();
 
  return 0;
}
C++
// Файл t.h
 
class Elem
{
private:
  int x;
public:
  Elem () { x = 0; }
  Elem (int _x) { x = _x; }
  int Get (void) { return x; }
  void Set (int _x) { x = _x; }
};
 
class Array
{
private:
  Elem *elems;
public:
  Array (unsigned size) { elems = new Elem[size]; }
  ~Array () { delete elems; }
  Elem Get (unsigned index) { return elems[index]; }
  void Set (unsigned index, const Elem &elem) { elems[index] = elem; }
};
Код
$ g++ t1.cc -O3
$ time ./a.out
real    0m1.719s
user    0m1.718s
sys     0m0.001s
========== Реализация методов в отдельном файле ==========

Файл t1.cc остаётся без изменений.

Из файла t.h удаляем все реализации

C++
// Файл t.h
 
class Elem
{
private:
  int x;
public:
  Elem ();
  Elem (int _x);
  int Get (void);
  void Set (int _x);
};
 
class Array
{
private:
  Elem *elems;
public:
  Array (unsigned size);
  ~Array ();
  Elem Get (unsigned index);
  void Set (unsigned index, const Elem &elem);
};
Добавляем файл t2.cc с реализацией методов

C++
// Файл t2.cc
 
#include "t.h"
 
Elem::Elem ()
{
  x = 0;
}
 
Elem::Elem (int _x)
{
  x = _x;
}
 
int
Elem::Get (void)
{
  return x;
}
 
void
Elem::Set (int _x)
{
  x = _x;
}
 
Array::Array (unsigned size)
{
  elems = new Elem[size];
}
 
Array::~Array ()
{
  delete elems;
}
 
Elem
Array::Get (unsigned index)
{
  return elems[index];
}
 
void
Array::Set (unsigned index, const Elem &elem)
{
  elems[index] = elem;
}
Код
$ g++ t1.cc t2.cc -O3
$ time ./a.out
real    0m24.781s
user    0m24.529s
sys     0m0.172s
 
Текущее время: 20:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru