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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.61
thick_int
Заблокирован
#1

Нюансы использования оператора sizeof() - C++

21.11.2011, 11:53. Просмотров 2957. Ответов 39
Метки нет (Все метки)

Пусть T - это некоторой тип, а t - это переменная типа T.
Может ли когда-нибудь выражение
C++
1
sizeof(T) != sizeof t
оказаться верным?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2011, 11:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нюансы использования оператора sizeof() (C++):

Нюансы использования оператора запятая или что такое UB и с чем его едят - C++
Почему студия и ideone выдают разные значения для a и b? в студии выходит a = 10 , b = 10 в ideone a = 20, b =10 #include...

Как корректно прервать цикл? (нюансы использования циклов, операторов ветвления и оператора break) - C++
Здравствуйте! такая форма работает...цикл нормально прерывается for(double i=1; i<=10; i++){ if(i==8) break; ...

Работа оператора Sizeof - C++
Каким образом вычисляется размер, допустим, массива int mass ? Где-то в памяти хранится размер, и оператор просто его оттуда вытаскивает,...

Объяснить нюансы использования литералов-перечислителей - C++
Почему в Си не допускается, чтобы один и тот же литерал-перечислитель входил в два различных перечислимых типа? Могут ли совпадать имена...

Нюансы использования операторов new/delete в деструкторах - C++
Подскажите пожалуйста, в чем проблема у меня в деструкторах? Есть 3 класса(по порядку размещения ниже), когда первые 2 удаляются все...

Нюансы синтаксиса и тонкости использования указателей и массивов - C++
Доброго времени суток! Никак не могу понять, почему один вариант кода работает: #include <iostream> #include <stdlib.h> ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Байт
Эксперт C
15992 / 10260 / 1537
Регистрация: 24.12.2010
Сообщений: 19,347
21.11.2011, 11:57 #2
Цитата Сообщение от thick_int Посмотреть сообщение
Пусть T - это некоторой тип, а t - это переменная типа T.
Может ли когда-нибудь выражение
C++
1
sizeof(T) != sizeof t
оказаться верным?
Скорее всего, нет. Но если мне приведут контрпример, буду весьма благодарен.

Добавлено через 1 минуту
Во всяком случае в Си без плюсов это точно так.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.11.2011, 11:59 #3
thick_int, sizeof всегда будет совпадать, а вот фактический размер может отличаться
Байт
Эксперт C
15992 / 10260 / 1537
Регистрация: 24.12.2010
Сообщений: 19,347
21.11.2011, 12:02 #4
Цитата Сообщение от Jupiter Посмотреть сообщение
thick_int, sizeof всегда будет совпадать, а вот фактический размер может отличаться
Как это?
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
21.11.2011, 12:06 #5
добавлю, что sizeof выполняется на этапе компиляции, и не вычисляет значения выражения, а только его тип
i.e. такой код полностью корректен:
C
1
2
int *p = NULL;
sizeof(*p);
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
21.11.2011, 12:10 #6
Добавлено через 1 минуту
Во всяком случае в Си без плюсов это точно так.
Почти так, только тут подвох в другом.
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
  
  printf("%d\n", sizeof('a'));
  printf("%d\n", sizeof(char));
  system("PAUSE");  
  return 0;
}
Результат 4, 1
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.11.2011, 12:10 #7
Байт,
C++
1
2
3
4
5
6
std::string str1("abcdefgihgklmnopqrstuxyzw1234567890");
std::string str2;
std::cout << sizeof(str1) << std::endl;
std::cout << sizeof(str2) << std::endl;
std::cout << str1.size() << std::endl;
std::cout << str2.size() << std::endl;
http://liveworkspace.org/code/12d0ab...8b25d72c8ca85a
KuKu, в Си символьный литерал(то что в одинарных кавычках) считается интом
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.11.2011, 12:12 #8
Цитата Сообщение от Net_Wanderer
добавлю, что sizeof выполняется на этапе компиляции, и не вычисляет значения выражения, а только его тип
i.e. такой код полностью корректен:
это не одно и то же

надо так:
C
1
    sizeof(int *) == sizeof(p)
не факт, что:
C
1
    sizeof(int *) == sizeof(*p)
C
1
    sizeof(int *) == sizeof(int)
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
21.11.2011, 12:13 #9
KuKu, в C, символьные литералы имеют тип int
в C++ - char
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
21.11.2011, 12:14 #10
Jupiter, ну формально, это ответ на вопрос) Подвох и есть в приведение типов.

KuKu, в Си символьный литерал(то что в одинарных кавычках) считается интом
Вы имеете ввиду идет приведение типов по умолчанию, или это просто инт? Как тогда можно явно задать один символ чар?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.11.2011, 12:25 #11
Цитата Сообщение от KuKu Посмотреть сообщение
Вы имеете ввиду идет приведение типов по умолчанию, или это просто инт?
вот тут уж точно не скажу, предположу что это зависит от реализации

Цитата Сообщение от KuKu Посмотреть сообщение
Как тогда можно явно задать один символ чар?
так и задавать)
Bers
Заблокирован
21.11.2011, 12:25 #12
C++
1
2
3
4
5
6
7
8
void Foo(char val) { std::cout<< "char\n";}
void Foo(int val ) { std::cout<< "int\n";}
 
int main()
{
    Foo('t'); //вывод: char
    return 0;
}

В си можно сделать явное приведение в стиле си




C
1
2
3
4
5
6
7
8
void Foo(char val) { std::cout<< "char\n";}
void Foo(int val ) { std::cout<< "int\n";}
 
int main()
{
    Foo( (char) 't'); //вывод: char
    return 0;
}
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
21.11.2011, 12:29 #13
так и задавать)
ну так не интересно( Вдруг кому-то надо константно задавать символы, и чтобы размер был один байт. Можно так кнечно писать, но что-то не то (char)'a'.
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
21.11.2011, 12:30 #14
accept, я не понял, что вы хотели сказать, в моем посте нет никаких сравнений, я хотел добавить, что sizeof выполняется в компильтайме, и что "разыменование" NULL-поинтера внутри sizeof'a допустимо
Байт
Эксперт C
15992 / 10260 / 1537
Регистрация: 24.12.2010
Сообщений: 19,347
21.11.2011, 12:30 #15
Jupiter, не убедили. sizeof и size - это разные вещи.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2011, 12:30
Привет! Вот еще темы с ответами:

Нюансы использования абстрактных базовых классов (класс Shape) - C++
У меня класс Point наследуется с абстрактного базового класса Shape, и Point тоже абстрактный, поскольку не определил функцию get_area()....

Объяснить нюансы использования указателей, массивов и ссылок в функциях - C++
Здравствуйте. Скажите, а что выводит arry значения элемента массива или его адрес? А как понимать что функция возвращает ссылку на int?...

Нюансы использования динамических массивов в качестве данных-членов в классах - C++
Здравствуйте! Не могу создать массив объектов. Помогите ... class hashTable { private: sortedlist* arr ; int arrSize; ...

Нюансы использования исключений: объяснить причины и способы устранения ошибки - C++
Есть такой кусочек кода. Я хочу просмотреть всё что хранится в операционной памяти. Ну и когда я пытаюсь посмотреть что у меня лежит по...


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

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

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