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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
ProNoooob
74 / 74 / 6
Регистрация: 14.10.2009
Сообщений: 121
#1

Расскажите про new и delete в C++ - C++

26.10.2009, 14:03. Просмотров 1364. Ответов 7
Метки нет (Все метки)

Есть несколько вопросов:
1) Можно ли перегрузить несколько операторов new в разных пространствах имен, а потом просто писать
int *t = mini::new int; ???
2) Можно ли вызвать конструктор и деструктор в своем аллокаторе, без перегрузки new и delete?
И про эффективность:
3) if(hello) это долго? Hello булева переменная. Желательно в тактах.
4) struct hello
{
unsigned short omg : 15;
bool init : 1;
};
Работа с такой структурой дольше, чем с обычной? То есть стоит ли экономить 1 байт?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2009, 14:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Расскажите про new и delete в C++ (C++):

Расскажите пожалуйста про флаги - C++
Доброго времени суток. Помогите пожалуйста разобраться с фалагми. Вот код: #include <iostream> #define ID_F 1001 #define ID_D 1002 ...

Расскажите на пальцах про классы - C++
Доброе время суток! (сразу оговорюсь, можете кинуть ссылкой куда мне пойти почитать) Сижу разбираюсь в классах и собственно вопросы:...

Расскажите популярно про ссылки и указатели - C++
Помогите разобраться со ссылками и указателями на различные объекты. Запутался вообще в них полностью. Когда читаю книгу про них, то вроде...

Расскажите про IDE Intel Parallel Studio XE 2015 - C++
Реклама на сайте Intel Parallel Studio XE 2015 написано хорошо, а тех кто пользовался стоит ли установить себе? Добавлено через...

Вопрос про catch и delete - C++
по какой причине данная операция совершается успешно? ведь указатель равен 0.

Расскажите про "тру" метод парсинга строки - C++
Опять Добрый день!))) Ой как я ошибался говоря что с парсингом не будет проблем((( Код void GetDirList(const char *Target) { ...

7
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
26.10.2009, 15:05 #2
Цитата Сообщение от ProNoooob Посмотреть сообщение
1)
Да.

Цитата Сообщение от ProNoooob Посмотреть сообщение
2)
Да.

Цитата Сообщение от ProNoooob Посмотреть сообщение
3)
Зависит от уровня косвенности. В пределах 2-7 машинных команд(не в тактах).

Цитата Сообщение от ProNoooob Посмотреть сообщение
4)
Не быстрее, не медленее.
Не стОит. Про выравнивание не забудь.
0
Evg
Эксперт CАвтор FAQ
17944 / 6175 / 411
Регистрация: 30.03.2009
Сообщений: 16,952
Записей в блоге: 27
26.10.2009, 15:31 #3
Цитата Сообщение от ProNoooob Посмотреть сообщение
4) struct hello
{
unsigned short omg : 15;
bool init : 1;
};
Работа с такой структурой дольше, чем с обычной? То есть стоит ли экономить 1 байт?
В общем случае работа идёт медленнее, т.к. при чтении-записи такой структуры требуется дополнительное построение битовой арифметики (не программисту требуется, а компилятор это делает). Замедление в зависимости от расположения поля (с краю подложки или в центре), архитектуры (есть или нет специальные операции по чтению/записи полей) может быть до 2 тактов на чтении и до 4 тактов на записи. При этом в случае нескольких подряд чтений или нескольких подряд записей за счёт оптимизаций потери могут сократиться. Если реально остро стоИт вопрос производительности, то работать с битовыми полями имеет смыл только тогда, когда программа будет потреблять много памяти.
0
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
26.10.2009, 15:38 #4
Цитата Сообщение от Evg Посмотреть сообщение
В общем случае работа идёт медленнее, т.к. при чтении-записи такой структуры требуется дополнительное построение битовой арифметики (не программисту требуется, а компилятор это делает)
Так это в компайл-тайм. (или нет? )
0
Evg
Эксперт CАвтор FAQ
17944 / 6175 / 411
Регистрация: 30.03.2009
Сообщений: 16,952
Записей в блоге: 27
26.10.2009, 16:14 #5
Цитата Сообщение от niXman Посмотреть сообщение
Так это в компайл-тайм. (или нет? )
Компайл-тайм никто в принципе не рассматривает. Речь идёт только о генерируемом коде

Добавлено через 9 минут
Грубо говоря, когда ты делаешь запись НЕбитового поля, то это выражается в одну операцию записи в память. Когда делаешь запись битового поля, то сначала нужно прочитать из памяти подложку (а любая операция чтения из памяти - это само по себе уже не быстро, особенно, если данных в кэше не оказалось), при помощи битовых операций втиснуть в подложку битовое поле, а потом модифицированную подложку записать в память

Да хоть по ассемблерной выдаче сравни два варианта. Палками выделаю непосредственно операцию записи поля. Сначала обычное поле

C
1
2
3
4
5
6
7
8
9
10
struct s
{
  int x;
};
 
void
func (struct s *p, int val)
{
  p->x = val;
}
Код
func:
        pushl   %ebp
        movl    %esp, %ebp
        movl    12(%ebp), %edx
        movl    8(%ebp), %eax
        -----------
        movl    %edx, (%eax)
        -----------
        popl    %ebp
        ret
Теперь битовое. Самый общий вариант (поле не прижато)

C
1
2
3
4
5
6
7
8
9
10
11
12
struct s
{
  int  :1;
  int x:30;
  int  :1;
};
 
void
func (struct s *p, int val)
{
  p->x = val;
}
Код
func:
        pushl   %ebp
        movl    %esp, %ebp
        movl    8(%ebp), %ecx
        movl    12(%ebp), %edx
        -----------
        movl    (%ecx), %eax       <--- читаем подложку
        andl    $0x7ffffffe, %edx  <--- в записываемом значении обнуляем биты, которые мимо поля
        andl    $0x80000001, %eax  <--- в подложке обнуляем биты, соотвествующие полю
        orl     %edx, %eax         <--- записываем значение в подложку
        movl    %eax, (%ecx)       <--- записываем модифицированную подложку
        -----------
        popl    %ebp
        ret
2
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
26.10.2009, 16:16 #6
Evg, Да, и вправду. Просто мои познания ассемблера, оставляют желать лучшего.
0
Evg
Эксперт CАвтор FAQ
17944 / 6175 / 411
Регистрация: 30.03.2009
Сообщений: 16,952
Записей в блоге: 27
26.10.2009, 16:18 #7
Цитата Сообщение от niXman Посмотреть сообщение
Evg, Да, и вправду. Просто мои познания ассемблера, оставляют желать лучшего.
А знания ассемблера тут особено не при чём. Просто представь себе, что в Си нет битовых полей, а тебе надо сделать (ну или как вариант всё это же самое упаковать в int).
1
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
26.10.2009, 16:19 #8
Evg, Логически верно. Спасибо!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2009, 16:19
Привет! Вот еще темы с ответами:

Расскажите пожалуйста про оператор "class" из учебника понял только как создать, как сделать содержимое открытым/закрытым... - C++
Расскажите пожалуйста про оператор &quot;class&quot; из учебника понял только как создать, как сделать содержимое открытым/закрытым... ...

В чем разница между delete и delete[]? - C++
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete от delete, т.к. я попробовал...

Чем отличается delete[] от delete? - C++
чем отличается? delete mas от delete mas

delete[] *pointer vs. delete pointer и утечка памяти - C++
Здравствуйте! Есть класс &quot;умного&quot; указателя counted_ptr, который удаляет хранящийся в нём T* owned; только если кол-во владельцев...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
26.10.2009, 16:19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru