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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
#1

Функция empty() !? - C++

03.02.2013, 03:27. Просмотров 3198. Ответов 4
Метки нет (Все метки)

Когда может применяться такая функция, в книге майерса по STL прочел заменяйте
C++
1
if (sizeof(Object) == 0)  // на if (empty(Object))
Но я никогда не видел объекта занимавшего 0.
C++
1
2
3
4
5
6
7
8
9
10
class Empty { };
void f()
    {
        Empty a, b;
        if (&a == &b) std::cout << "если данная строка выведена на экран, то есть ошибка в работе компилятора";
 
        Empty* p1 = new Empty;
        Empty* p2 = new Empty;
        if (p1 == p2) std::cout << "если данная строка выведена на экран, то есть ошибка в работе компилятора";
    }
Ошибок в работе компилятора не обнаружено.
Через гугл смог узнать что размер базового класса если его взвесить через производный класс будет равен нулю.
Есть ли этому какое-то более широкое применение?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2013, 03:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция empty() !? (C++):

Добавить операцию empty() в стек - C++
Добавьте в программы реализацию операции empty(), а также реакцию на ситуации “overflow” и “underflow”. Учу С++,но до ООП еще не...

Deleted и empty в закрытом хэшировании - C++
Уважаемые участники форума, хотелось бы получить ответ на следующий вопрос. Реализую закрытое хэширование, завожу массив указателей на...

Error LNK2019 при компиляции empty project - C++
День добрый! Создаю новый пустой проект в VS 2010 со следующей структурой: Header Files: header.h #include &lt;windows.h&gt; #include...

Проверить _bstr_t строку на пустое значение или empty - C++
Здравствуйте уважаемые ГУРУ! Подскажите пожалуйста как можно проверить _bstr_t строку на пустое значение или empty Там есть какие-то...

[C++ Error] Unit1.cpp(9): E2129 Character constant too long (or empty) - C++
Ошибка : Unit1.cpp(9): E2129 Character constant too long (or empty) Указывает на cout&lt;&lt;x&lt;&lt;' '; Исходник : ...

Не могу исправить ошибку(error C2137: empty character constant) - C++
задание найти с помощью функции максимальный и минимальный элемент массива размерностью m*n и вывести на экран ошибка одна: error...

4
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,633
03.02.2013, 03:46 #2
Цитата Сообщение от vbloodv Посмотреть сообщение
Но я никогда не видел объекта занимавшего 0.
По стандарту размер объекта класса имеет ненулевое значение.

Добавлено через 1 минуту
Если не верите наслово, могу ссыль дать
0
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
03.02.2013, 03:56  [ТС] #3
Цитата Сообщение от MrGluck Посмотреть сообщение
По стандарту размер объекта класса имеет ненулевое значение.
Верю, вот и я сомневался в что у Маерса с головой порядок. Тоже самое нашел за это время...
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
03.02.2013, 04:27 #4
Цитата Сообщение от vbloodv Посмотреть сообщение
if (sizeof(Object) == 0) *// на if (empty(Object))
насколько я помню, там речь шла о
C++
1
(container.size() == 0)
vs
C++
1
container.empty()
Добавлено через 26 минут
Цитата Сообщение от MrGluck Посмотреть сообщение
По стандарту размер объекта класса имеет ненулевое значение.
Добавлено через 1 минуту
Если не верите наслово, могу ссыль дать
почти

3 Complete objects and member subobjects of class type shall have nonzero size.
94)
[Note:class objects can
be assigned, passed as arguments to functions, and returned by functions (except objects of classes for
which copying has been restricted; see 12.8). Other plausible operators, such as equality comparison, can
be defined by the user; see 13.5. ]
94) Base class subobjects are not so constrained.ed.
то есть для базовых таки допускается
http://www.cantrip.org/emptyopt.html
How can you avoid this overhead? The Draft hints, in a footnote:

A base class subobject of an empty class type may have zero size.
In other words, if you declared Baz2 this way,


struct Baz2 : Bar {
int* p;
};

then a compiler is allowed to reserve zero bytes for the empty base class Bar; hence, sizeof(Baz2) can be just 4 on most architectures. (See Figure 1b.)
Compiler implementers are not _required_ to do this optimization, and many don't, yet. However, y
1
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,633
03.02.2013, 05:10 #5
Действительно
1.8 The C++ object model
5 Unless it is a bit-field (9.6), a most derived object shall have a non-zero size and shall occupy one or more
bytes of storage. Base class subobjects may have zero size. An object of trivially copyable or standard-layout
type (3.9) shall occupy contiguous bytes of storage.
6 Unless an object is a bit-field or a base class subobject of zero size, the address of that object is the address
of the first byte it occupies. Two distinct objects that are neither bit-fields nor base class subobjects of zero
size shall have distinct addresses.4
Добавлено через 2 минуты
я могу ошибаться, но у Мейерса в "Эффективное использование С++. 50 рекомендаций по улучшению..." не было об этом ни слова, говорилось всегда не равно 0.

Добавлено через 16 минут
Нашел цитату из книги (стр. 45, правило 8)
"все самостоятельные классыhttp://www.cyberforum.ru/cgi-bin/latex.cgi?{}^{1} имеют ненулевой размер"
и сноска мелким шрифтом внизу
"Имеются ввиду невложенные классы. - Прим. научного редактора."
0
03.02.2013, 05:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2013, 05:10
Привет! Вот еще темы с ответами:

Перегрузка операций: friend-функция или функция-член класса - C++
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и friend. Вот к примеру такой код. class...

Функция удаления текста в скобках [2], непосредственно функция + 12кб вложений - C++
Доброго времени суток, случилось так, что пришлось работать с с-строками (лаба, угу), в которой нужно удалить весь текст в скобках,...

Функция sqrt: существует более одного экземпляра. Функция перегруженная - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;iomanip&gt; using namespace std; int main(){ float s, p; int c, a; s=0; ...

какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get() - C++
какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()


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

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

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