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

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

Войти
Регистрация
Восстановить пароль
 
 
mxs89
11 / 11 / 4
Регистрация: 13.04.2015
Сообщений: 159
Завершенные тесты: 1
#1

Функции, зависимые от реализации компилятора - C++

24.08.2016, 02:29. Просмотров 428. Ответов 18
Метки нет (Все метки)

какой вызов является зависимым от реализации компилятора?
realloc(..., 0)
memcpy() между объектами, перекрывающими друг друга
free(strdup())
calloc() нулевого размера
realloc(NULL, ...)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2016, 02:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функции, зависимые от реализации компилятора (C++):

Функции, зависимые от параметра шаблона - C++
Всем привет. Допустим имеется шаблонный класс template<class T> class Test { T _t; public: Test(T& t) : _t(t) { } int...

Необходимость реализации виртуальнй функции - C++
Добрый день. Возник следующий вопрос. class A { virtual void foo() = 0; //чисто виртуальная функция }

Ошибка в реализации хеш-функции SHA1 - C++
Здравствуйте, Решил написать простую реализацию, но результат вычислений оставляет желать лучшего Подскажите, пожалуйста, какой нюанс я...

Объясните цикл в реализации функции strcpy - C++
На форуме нашел реализацию функции strcpy: char * strcpy(char * dst, const char * src){ char * d = dst; while ( *d++ = *src++ ) ...

Программа реализации функции х % от у - остаток от деления (при этом х % 0 = 0) - C++
помогите написать стандартную программу для мпд, которая реализует функцию х % от у - остаток от деления (при этом х % 0 = 0). помогите...

Есть ли более правильный и элегантный способ реализации функции? - C++
Доброе время форумчане! bool db::CreateSQLTable() { QSqlQuery a; QString str = "CREATE TABLE "SortFiles" ("id" INTEGER...

18
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
24.08.2016, 09:10 #2
mxs89, второй вариант (memcpy).
0
HighPredator
5544 / 1857 / 346
Регистрация: 10.12.2010
Сообщений: 5,479
Записей в блоге: 2
24.08.2016, 09:16 #3
Из перечисленного implementation-defined случаями являются:
1) realloc(..., 0)
2) calloc() нулевого размера
в соответствии с п.7.22.3 абзац 1 стандарта C11.
К ним я также склонен отнести и случай
free(strdup())
поскольку strdup() не является стандартизированной языком функцией, и как следствие она не обязана поддерживаться компиляторами.
0
HelicopterK52
682 / 207 / 28
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
24.08.2016, 09:39 #4
Цитата Сообщение от DrOffset Посмотреть сообщение
mxs89, второй вариант (memcpy).
Достаточно запутано всё.
Зависит от реализации - это же implementation-defined behavior.
А memcpy с перекрывающимися диапазонами - это undefined behavior.
С другой стороны, эта самая неопределенность в поведении зависит не только от погоды на Марсе, но и от реализации. Я бы предпочел уточнить что нужно ТС.
Цитата Сообщение от HighPredator Посмотреть сообщение
1) realloc(..., 0)
2) calloc() нулевого размера
Если верить: http://www.cplusplus.com/reference/cstdlib/realloc/
то в зависимости от "эпохи", поведение разное. В последнем стандарте - Implementation-defined.
Так что нужно узнать из какого года препод.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
24.08.2016, 09:42 #5
HighPredator, опять мутная постановка вопроса.

Что вот понимается под "реализацией компилятора"? Если в том числе реализация библиотеки, то да, в соответствии с текущим стандартом предсказуем только последний вариант. Все остальные варианты так или иначе implementation-defined.
Вариант realloc(..., 0) был однозначным в C89, в этом случае realloc работает как free и возвращает NULL. В С11 - возвращаемое значение стало implementation defined.

Я же понимал вопрос буквально. Если речь именно про реализацию компилятора, а memcpy обычно реализуется именно как builtin-функция компилятора, и при этом по стандарту (п. 7.21.2.1/2 - iso/iec 9899:1999) она не позволяет копировать пересекающиеся участки памяти, то речь в вопросе именно о ней. С учетом того, что формулировка записана в единственном числе (т.е. делаем вывод, что вариант ответа только один).

Так что, автор, тут смотря как твой вопрос понимать и в соответствии с каким стандартом нужно отвечать. Так что не обессудь, коль что.
1
HelicopterK52
682 / 207 / 28
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
24.08.2016, 09:44 #6
Цитата Сообщение от DrOffset Посмотреть сообщение
стандартом предсказуем только последний вариант.
Последний вариант:
Цитата Сообщение от mxs89 Посмотреть сообщение
realloc(NULL, ...)
т.е. это может быть realloc(NULL, 0)
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
24.08.2016, 09:47 #7
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
А memcpy с перекрывающимися диапазонами - это undefined behavior.
Это да. Но может вопрос задавался с отсылкой на эпический разнос от Торвальдса, по поводу изменения поведения memcpy в одном из релизов GCC.
0
SmittWesson
120 / 171 / 17
Регистрация: 04.06.2014
Сообщений: 1,295
24.08.2016, 09:49 #8
Ещё в 1984-м на конференции программёров, этот вопрос рассматривался. Не Парься, решили выделять память по факту существования областей. Если не хватает, зачистка при помощи уборщика. Блин, с тех пор ничего не изменилось!
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
24.08.2016, 09:51 #9
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
т.е. это может быть realloc(NULL, 0)
Да, может и так.
Вообще, я считаю, поделом.
Если этот вопрос в тесте, то он составлен двусмысленно и ответить на него абсолютно правильно нельзя.
Если это вопрос на "поговорить", то автор занимается самообманом пытаясь получить ответ на форуме. Зачем задающему чужие мысли, ему нужны мысли автора.
0
HelicopterK52
682 / 207 / 28
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
24.08.2016, 09:55 #10
Цитата Сообщение от DrOffset Посмотреть сообщение
эпический разнос от Торвальдса
Торвальдс любит разносить всех. Правда разносит он то, что не угождает именно ему, имхо.
Да и сам Торвальдс не особо заботится о легаси, зато на других кричит, что поменяли поведение.
Это я не о memcpy сейчас, а вообще.

Добавлено через 3 минуты
DrOffset, вообще, можно сказать, что любой вызов зависит от реализации компилятора. Ведь именно компилятор занимается подготовкой вызова, раскладывает что куда нужно и т.д.
0
HighPredator
5544 / 1857 / 346
Регистрация: 10.12.2010
Сообщений: 5,479
Записей в блоге: 2
24.08.2016, 09:57 #11
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
в зависимости от "эпохи", поведение разное
Специально сейчас открыл: C89, п.7.20.3 абзац 1: все так же: implementation-defined.
Цитата Сообщение от DrOffset Посмотреть сообщение
Что вот понимается под "реализацией компилятора"?
Я это трактовал как в стандарте: поскольку они под implementation имеют ввиду реализацию в компиляторе.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
24.08.2016, 10:06 #12
Цитата Сообщение от HighPredator Посмотреть сообщение
Специально сейчас открыл: C89, п.7.20.3 абзац 1: все так же: implementation-defined.
С89 - это же ANSI стандарт (у меня его нет)?
У меня есть ISO\IEC 9899:1990, и там даже п. 7.20.3 нет, все заканчивается на 7.13.
А в 7.10.3, про realloc ничего такого насчет implementation-defined не написано.
0
HelicopterK52
682 / 207 / 28
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
24.08.2016, 10:17 #13
Цитата Сообщение от HighPredator Посмотреть сообщение
все так же: implementation-defined.
А непосредственно в описании realloc:
If size is zero and ptr is not a null pointer, the object it points to is freed.
2
HighPredator
5544 / 1857 / 346
Регистрация: 10.12.2010
Сообщений: 5,479
Записей в блоге: 2
24.08.2016, 10:21 #14
DrOffset, я ошибся, это С99. В С89, это раздел 4.10.3 Memory management functions -- http://port70.net/~nsz/c/c89/c89-draft.txt

Добавлено через 3 минуты
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
А непосредственно в описании realloc
Это из какого пункта? У меня такой цитаты ни в одном стандарте нет.
0
HelicopterK52
682 / 207 / 28
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
24.08.2016, 10:24 #15
Цитата Сообщение от HighPredator Посмотреть сообщение
Это из какого пункта? У меня такой цитаты ни в одном стандарте нет.
Да вот в том же документе, на который Вы ссылку дали
Чуть ниже в 4.10.3.4 The realloc function
1
24.08.2016, 10:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2016, 10:24
Привет! Вот еще темы с ответами:

"Перепрыгивание" компилятора к части кода после выхода из функции - C++
Уважаемые форумчане! Решил обратиться к вам, благо уже не знаю, что делать. Накодил я тут QuickSort текста по алфавиту для лабы. Он...

Отделение интерфейса от реализации класса: компиляция кода реализации - C++
Доброго времени суток, У меня возникла проблема с отделением интерфейса от реализации класса. Допустим, у меня есть три файла: 1....

Как установить конец строки при своей реализации функции strcpy()? - C++
Доброго времени суток, попробовал сам реализовать функцию strcpy(). Программа работоспособная, но интересует один момент. Это рабочий...

Как правильно инициализировать данные-члены строкового типа в реализации функции-члена? - C++
Всем здравствуйте. У меня тут возникла очень глупая ошибка и я не могу понять в чем причина и как ее исправить. Значит, имеется структура. ...


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

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

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