Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/37: Рейтинг темы: голосов - 37, средняя оценка - 4.51
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1

Cтоит ли после изучения Си++ изучить Си

07.03.2015, 19:44. Показов 8037. Ответов 95
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, стоит ли после изучения Си++ изучить Си? Ведь в Си++ поддерживаются все сишные команды (например, alloc, realloc и т.д.) Но в учебниках по Си++ о них ни слова.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.03.2015, 19:44
Ответы с готовыми решениями:

У меня есть литература для изучения delphi 7. Могу ли я по ней изучить delphi 2010?
Всем привет. Очередной семестр в универе подходит к концу, а лабы по программированию сданы и мне нечем заняться =). Я хочу изучить delphi...

Какие книги лучше всего изучить чтобы хорошо изучить с++
Хотелось бы открыть тему, либо если она уже есть подскажите ссылку. Хочу собрать список книг чтобы изучить профессионально с++, если...

Что изучить после Паскаля?
Всем привет. Прошло 10 месяцов, как начал изучать паскаль. И сейчас продолжаю изучать по книгу Валерия Фаронова " Turbo Pascal. ...

95
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.03.2015, 21:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Потому что так делать - это UB. VS упал, GCC не упал. Потому что GCC взял и сделал из виртуального вызова невиртуальный. Контекст-то доступен весь.
- подскажи какой именно у тебя код упал?
Миниатюры
Cтоит ли после изучения Си++ изучить Си   Cтоит ли после изучения Си++ изучить Си  
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
07.03.2015, 21:46
Цитата Сообщение от DrOffset Посмотреть сообщение
Потому GCC что взял и сделал из виртуального вызова невиртуальный.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class cTest{
    public:
    int param;
    cTest(){
        param = 0;
    }
};
class cContainer{
    protected:
    cTest entry;
    public:
    void set(int param = 0){
        entry.param = param;
    }
    int operator()(void){
        return entry.param;
    }
};
int main()
{
    static_assert(std::is_standard_layout<cContainer>::value, "");
    return 0;
}
Как так ? Ладно там оптимизация виртуальных методов в простые, однако здесь класс с protected уровнем доступа и считается стандартно размещенным, не говоря уже о POD? (GCC)
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
07.03.2015, 21:48
Цитата Сообщение от DrOffset Посмотреть сообщение
vptr инициализируется вызовом конструктора. В коде с malloc его не было. Отсюда падение
я это и пытаюсь донести им. А они мне "при malloc не создается объект, а лишь выделяется память", что полностью верно. Дотошные ...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.03.2015, 21:52
Цитата Сообщение от -=ЮрА=-
подскажи какой именно у тебя код упал?
Упал код, который дал rikimaru2013.

Цитата Сообщение от gromo Посмотреть сообщение
Как так ?
Что есть cTest?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
07.03.2015, 21:53
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
я это и пытаюсь донести им
Ну и мы тебе тоже
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
А они мне "при malloc не создается объект,
ну правильно
malloc не вызывает конструктор, о чем я сразу написал,конструктор не вызывается не создается объект,
следовательно malloc не создает объект
круг замкнулся
0
07.03.2015, 21:54

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Что есть cTest?
Я уже добавил в сообщение. Эти классы -=ЮрА=- приводил ранее.

0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.03.2015, 21:55
Цитата Сообщение от gromo Посмотреть сообщение
однако здесь класс с protected уровнем доступа и считается стандартно размещенным ?
Да, считается. Потому что все его поля находятся в одной секции. Порядок размещение не гарантируется, только если это разные секции.
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.03.2015, 21:56
Цитата Сообщение от DrOffset Посмотреть сообщение
Упал код, который дал rikimaru2013.
- причём здесь виртуальное наследование к механизму выделению памяти?new к virtual имеет точно такое же отношение как огнетушитель в ядерной установке к атомному взрыву.
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
07.03.2015, 21:58
Цитата Сообщение от DrOffset Посмотреть сообщение
Потому что все его поля находятся в одной секции
Я и не обратил внимание
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.03.2015, 21:59
Цитата Сообщение от -=ЮрА=-
причём здесь виртуальное наследование к механизму выделению памяти?
К механизму выделения не при чем.
Он при чем к иницализации объекта. Коль скоро vptr иницализируется конструктором, то код rikimaru2013 падает при попытке виртуального вызова.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
07.03.2015, 22:02
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
причём здесь виртуальное наследование к механизму выделению памяти?
Юра, там не виртуальное наследование а виртуальные функции
следовательно должна быть таблица,даже если одна функция
таблица инициализируется при вызове конструктора
при malloc нет вызова конструктора, таблица указывает в космос, при вызове метода(виртуального) прога падает
ибо элементы таблицы указывают "в никуда"
ты же в своей проге (пост 33) убрал волшебное слово virtual, что и изменило поведение
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.03.2015, 22:06
Короче ещё раз для страждущих http://www.cplusplus.com/reference/new/ operator%20new/ (пробел перед operator т.к форум коробит ссылку).
placement
Simply returns ptr (no storage is allocated).
Notice though that, if the function is called by a new-expression, the proper initialization will be performed (for class objects, this includes calling its default constructor).
- не надо сюда тулить механизм виртуального наследования(!)

Добавлено через 3 минуты
ValeryS, ну так табличу виртуальных методов линкер делает встречая virtual а не new если уже пошла такая пьянка что разбираем каждое слово. Когда нет виртуального наследования имеем простую матрёшку
C : B : A{} ~= C{ B{ A } } - т.е имеем по сути несколько объектов с их константным размером который обеспечивает при выделении маллок либо нью, когда используем виртуальный механизм, то компилятор создаёт таблицу виртуальных методов и на этапе связывания уже находит нужный метод конкретно из контекста кода(обычно виртуальный метод во внешнем классе), теперь мне "убогому" пусть кто то объяснит каким чёртом выделение памяти соотносится к механизму виртуального наследования?Мы начали за здравие а заканчиваем за упокой.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.03.2015, 22:09
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ну так табличу виртуальных методов линкер делает встречая virtual а не new
Но речь не про табличку, а про указатель на нее (vptr).
Этот указатель есть в каждом объекте, где есть виртуальные методы, и этот указатель должен иметь валидное значение. Это значение задает конструктор.
Собственно об этом тут и речь.
А не про выделение памяти как таковое.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
07.03.2015, 22:12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ValeryS, ну так табличу виртуальных методов линкер делает встречая virtual а не new
делает то линкер
а присваивает то адрес этой таблички во время выполнения конструктор, а при malloc конструктор не вызывается
при встрече слова virtual в класс добавляется еще одно поле, указатель на таблицу
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
и на этапе связывания уже находит нужный метод конкретно из контекста кода(обычно виртуальный метод во внешнем классе),
может и бывает так не спорю
но я чаше всего встречал типа такого
C++
1
call ebx+0c;
ebx указатель на виртуальную таблицу
пишу по памяти могу ошибаться
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.03.2015, 22:15
new непосредственно не относится к виртуальному наследованию есть несколько форм new которые в синтаксисе имеют одинаковую форму ключевого слова new - предназначение new активировать выделение памяти, в зависимости от перегрузки new запускает либо обычный malloc либо создаётся объект посредством перегруженной формы placement_new, ключевое слово virtual сообщает компилятору о полиморфности объекта и о том что при создании объекта к нему надо прицепить таблицу виртуальных методов. Как то так простыми словами. Что из сказанного мной выше идёт в разрез со сказанным?Да создание объекта + virtual активирует механизм виртуального наследования, но не new за это отвечает.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
07.03.2015, 22:17
Знание других языков всегда полезно, знание си для плюсов полезно в квадрате. Надо понимать как всё работает под капотом чтобы лучше пользоваться вещами. Можно понять что понудило спроектировать некоторые вещи именно подобным образом.
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.03.2015, 22:20
-=ЮрА=-, кроме того, что ты решил, что тут обсуждается выделение памяти, ничего.
Тут, начиная с примера rikimaru2013, обсуждалось не выделение памяти, а инициализация (объекта), которую проводит new-expression и не проводит malloc. Наследование, виртуальные функции - все это уже вторично.

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Notice though that, if the function is called by a new-expression, the proper initialization will be performed (for class objects, this includes calling its default constructor).
Вот твоя цитата, как раз про это и написано.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
07.03.2015, 22:21
вот кусок реальной дизасемблированой проги
конструктор
Assembler
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
.text:005F1C20 ; int __cdecl CSiudi_CSiudi(); конструктор
.text:005F1C20 CSiudi_CSiudi proc near
.text:005F1C20
.text:005F1C20 var_14= dword ptr -14h
.text:005F1C20 var_10= dword ptr -10h
.text:005F1C20 var_C= dword ptr -0Ch
.text:005F1C20 var_4= dword ptr -4
.text:005F1C20
.text:005F1C20 push    ebp
.text:005F1C21 mov     ebp, esp
.text:005F1C23 push    0FFFFFFFFh
.text:005F1C25 push    offset sub_62FE13
.text:005F1C2A mov     eax, large fs:0
.text:005F1C30 push    eax
.text:005F1C31 sub     esp, 8
.text:005F1C34 push    ebx
.text:005F1C35 push    esi
.text:005F1C36 push    edi
.text:005F1C37 mov     eax, ___security_cookie
.text:005F1C3C xor     eax, ebp
.text:005F1C3E push    eax
.text:005F1C3F lea     eax, [ebp+var_C]
.text:005F1C42 mov     large fs:0, eax
.text:005F1C48 mov     esi, ecx
.text:005F1C4A mov     [ebp+var_10], esi
.text:005F1C4D lea     edi, [esi+CSiudi.xzStrings]
.text:005F1C50 mov     dword ptr [esi], offset CSiudi_vtlb ; присвоение адреса таблицы
.text:005F1C56 mov     [ebp+var_14], edi
вот вызов виртуальной функции
Assembler
1
2
3
4
5
6
7
.text:005E8BFA mov     edx, [ebx] ; адрес таблицы
.text:005E8BFC mov     esi, [ebp+argString]
.text:005E8BFF mov     eax, [edx+4] ; адрес виртуальной функции
.text:005E8C02 push    esi
.text:005E8C03 mov     ecx, ebx
.text:005E8C05 mov     [ebp+arg_0], ebx 
.text:005E8C08 call   eax; вызов виртуальной функции
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.03.2015, 22:26
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот твоя цитата, как раз про это и написано.
-
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
rikimaru2013, у тебя действительно спросили за placement new
читай дискуссию. Ты сам пишешь
Цитата Сообщение от DrOffset Посмотреть сообщение
Наследование, виртуальные функции - все это уже вторично.
ну так вот и не путай rikimaru2013, с тем что нью не выделяет память new выделяет память как маллок и рабоатет это всё как для простого кода так и для кода с простым наследованием. placement_new не создаёт виртуальной таблицы, я вообще не понимаю к чему твои посты, спор ради спора? Вот скажи что ты конкретно отстаиваешь, в чём со мной не согласен?Я лично хз, просвети конкретно с чем ты не согласен ибо тогда я не понимаю зачем вообще пишешь.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.03.2015, 22:28
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
я вообще не понимаю к чему твои посты, спор ради спора, вот скажи что ты конкретно отстаиваешь?Я лично хз, просвети конкретно с чем ты не согласен ибо тогда я не понимаю зачем вообще пишешь.
Я с тобой вообще дискуссию не вел. Ты сам меня спросил какой код упал, я ответил. Я всегда лишь отвечаю на твои вопросы.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.03.2015, 22:28

Куда идти после изучения ЯПа?
Много раз слышал что то вроде &quot;С чего начать программировать, куда идти, шо учить?&quot;, для себя этот вопрос давно решил и сейчас, спустя...

Что выбрать после изучения MYSQL?
Привет ... Сначала изучил MYSQL .Выбрал его потому что он тесно связан с вебом. Хочу углубится в изучении БД. Подскажите что сейчас...

Стоит ли учить C# после изучения VB .NET?
Стоит ли учить c# после изучения vb.net?И чем плюсы c# от vb.net?

Что изучать после изучения основ языка
Доброго дня друзья. У меня такой вопрос. Подруга изучила основы С++, параллельно изучает книгу по алгоритмам и вот думает сейчас куда ей...

В каком направлении развиваться после изучения основ С++
После пройденого материала в институте и сдачи экзамена и курсача я задался вопросом а что дальше делать как развиваться. Помогите плиз...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru