Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
ProNoooob
77 / 77 / 8
Регистрация: 14.10.2009
Сообщений: 121
1

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

26.10.2009, 14:03. Просмотров 1424. Ответов 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
Ответы с готовыми решениями:

Расскажите пожалуйста про флаги
Доброго времени суток. Помогите пожалуйста разобраться с фалагми. Вот код:...

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

Расскажите популярно про ссылки и указатели
Помогите разобраться со ссылками и указателями на различные объекты. Запутался...

Расскажите про IDE Intel Parallel Studio XE 2015
Реклама на сайте Intel Parallel Studio XE 2015 написано хорошо, а тех кто...

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

7
niXman
Эксперт С++
3205 / 1454 / 73
Регистрация: 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
19637 / 7329 / 551
Регистрация: 30.03.2009
Сообщений: 20,498
Записей в блоге: 30
26.10.2009, 15:31 3
Цитата Сообщение от ProNoooob Посмотреть сообщение
4) struct hello
{
unsigned short omg : 15;
bool init : 1;
};
Работа с такой структурой дольше, чем с обычной? То есть стоит ли экономить 1 байт?
В общем случае работа идёт медленнее, т.к. при чтении-записи такой структуры требуется дополнительное построение битовой арифметики (не программисту требуется, а компилятор это делает). Замедление в зависимости от расположения поля (с краю подложки или в центре), архитектуры (есть или нет специальные операции по чтению/записи полей) может быть до 2 тактов на чтении и до 4 тактов на записи. При этом в случае нескольких подряд чтений или нескольких подряд записей за счёт оптимизаций потери могут сократиться. Если реально остро стоИт вопрос производительности, то работать с битовыми полями имеет смыл только тогда, когда программа будет потреблять много памяти.
0
niXman
Эксперт С++
3205 / 1454 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
26.10.2009, 15:38 4
Цитата Сообщение от Evg Посмотреть сообщение
В общем случае работа идёт медленнее, т.к. при чтении-записи такой структуры требуется дополнительное построение битовой арифметики (не программисту требуется, а компилятор это делает)
Так это в компайл-тайм. (или нет? )
0
Evg
Эксперт CАвтор FAQ
19637 / 7329 / 551
Регистрация: 30.03.2009
Сообщений: 20,498
Записей в блоге: 30
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
Эксперт С++
3205 / 1454 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
26.10.2009, 16:16 6
Evg, Да, и вправду. Просто мои познания ассемблера, оставляют желать лучшего.
0
Evg
Эксперт CАвтор FAQ
19637 / 7329 / 551
Регистрация: 30.03.2009
Сообщений: 20,498
Записей в блоге: 30
26.10.2009, 16:18 7
Цитата Сообщение от niXman Посмотреть сообщение
Evg, Да, и вправду. Просто мои познания ассемблера, оставляют желать лучшего.
А знания ассемблера тут особено не при чём. Просто представь себе, что в Си нет битовых полей, а тебе надо сделать (ну или как вариант всё это же самое упаковать в int).
1
niXman
Эксперт С++
3205 / 1454 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
26.10.2009, 16:19 8
Evg, Логически верно. Спасибо!
0
26.10.2009, 16:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2009, 16:19

Расскажите про "тру" метод парсинга строки
Опять Добрый день!))) Ой как я ошибался говоря что с парсингом не будет...

Про утечку памяти, new, delete и функции, возвращающие указатель на структуру
О как тему назвал! Очередной вопрос от новичка. Допустим, есть код. ...

Про указатели, массивы, new/delete и красивости /* удалить/вставить в массив */
Тут много тем с вопросами &quot;удалить\вставить из\в массив&quot; Не нравились они мне,...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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