Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> sizeof(std::string) == 32, Почему ??? 
V
    Опции темы
Любитель
Дата 30.7.2008, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Lycifer @  30.7.2008,  16:58 Найти цитируемый пост)
STL == как на ресурсы, работать быстро - гдк то слышал, хотя работать быстро не получается(во первых память не вовремя олсвобождается, а во вторых new,delete,malloc,realloc - медленнеы так как ищют дырки в памяти, то и есть свободные места) 

Ой, а можно по-русски? smile

Добавлено через 21 секунду
Да, и кстати boost::array - это для массивов постоянного размера.


--------------------
PM MAIL ICQ Skype   Вверх
SABROG
Дата 30.7.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



А вот в подтверждение моих слов результаты метода max_size(), который возвращает максимальное количество символов, которое может содержать экземпляр класса std::string:

gcc - 1073741820
msvc - 4294967294

Т.е. все-таки msvc хоть и имеет размер класса 28 байт, но он резервирует много памяти для новой строки о чем говорит функция capacity(), которая возвращает 15 байт для msvc и 0 байт для gcc.

Это сообщение отредактировал(а) SABROG - 30.7.2008, 17:19


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
just_geek
Дата 30.7.2008, 18:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 13.12.2007

Репутация: 2
Всего: 10



Еще ради интереса stlport бы сравнили на обоих компиляторах smile А так же gcc 4.x 
PM MAIL   Вверх
vinter
Дата 30.7.2008, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



мне вот интересно к чему эти тесты? если бы С строки оказались быстркее, вы бы отказались от string? иЛи из-за того, что msvc дает меньший размер все бросят gcc? по моему это пустая трата времени...


--------------------
Мой блог
PM MAIL WWW   Вверх
Любитель
Дата 30.7.2008, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



А к чему любые подобные тесты? smile 


--------------------
PM MAIL ICQ Skype   Вверх
SABROG
Дата 30.7.2008, 19:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(just_geek @ 30.7.2008,  18:25)
Еще ради интереса stlport бы сравнили на обоих компиляторах smile А так же gcc 4.x

Ага, а потом начнется, а вот еще и для watcom сравните и для icc и для bcc. А потом на разных платформах, операционных системах. А потом версии библиотек, стабильные/не стабильные. А потом еще и с разными ключами собранные библиотеки. А потом скажут, что сравниваете не верно, код должен быть другой. smile 


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 30.7.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



А у меня stlport не собирается для Студии. Вот что сообщает:
Код

C:\projects\stlport\build\lib>nmake -fmsvc.mak

Microsoft (R) Program Maintenance Utility Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl /nologo /W4 /Wp64 /GR /EHsc /Zm800  /GL /MD /Zi /O2  /DWIN32 /D_WINDO
WS /DNDEBUG  /I../../stlport  /c /Foobj\vc8\shared\dll_main.o /Fdobj\vc8\shared\
stlport.5.1.pdb ../../src\dll_main.cpp
cl : Command line warning D9035 : option 'Wp64' has been deprecated and will be
removed in a future release
dll_main.cpp
C:\projects\stlport\stlport\stl/_locale.h(108) : error C2487: 'collate' : member
 of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_locale.h(109) : error C2487: 'ctype' : member o
f dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_locale.h(110) : error C2487: 'monetary' : membe
r of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_locale.h(111) : error C2487: 'numeric' : member
 of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_locale.h(112) : error C2487: 'time' : member of
 dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_locale.h(113) : error C2487: 'messages' : membe
r of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_locale.h(118) : error C2487: 'all' : member of
dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(74) : error C2487: 'right' : member
of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(75) : error C2487: 'internal' : memb
er of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(76) : error C2487: 'dec' : member of
 dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(77) : error C2487: 'hex' : member of
 dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(78) : error C2487: 'oct' : member of
 dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(79) : error C2487: 'fixed' : member
of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(80) : error C2487: 'scientific' : me
mber of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(81) : error C2487: 'boolalpha' : mem
ber of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(82) : error C2487: 'showbase' : memb
er of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(83) : error C2487: 'showpoint' : mem
ber of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(84) : error C2487: 'showpos' : membe
r of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(85) : error C2487: 'skipws' : member
 of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(86) : error C2487: 'unitbuf' : membe
r of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(87) : error C2487: 'uppercase' : mem
ber of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(88) : error C2487: 'adjustfield' : m
ember of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(89) : error C2487: 'basefield' : mem
ber of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(90) : error C2487: 'floatfield' : me
mber of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(93) : error C2487: 'goodbit' : membe
r of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(94) : error C2487: 'badbit' : member
 of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(95) : error C2487: 'eofbit' : member
 of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(96) : error C2487: 'failbit' : membe
r of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(99) : error C2487: '__default_mode'
: member of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(100) : error C2487: 'app' : member o
f dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(101) : error C2487: 'ate' : member o
f dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(102) : error C2487: 'binary' : membe
r of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(103) : error C2487: 'in' : member of
 dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(104) : error C2487: 'out' : member o
f dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(105) : error C2487: 'trunc' : member
 of dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(109) : error C2487: 'beg' : member o
f dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(110) : error C2487: 'cur' : member o
f dll interface class may not be declared with dll interface
C:\projects\stlport\stlport\stl/_ios_base.h(115) : error C2487: 'end' : member o
f dll interface class may not be declared with dll interface
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN
\cl.EXE"' : return code '0x2'
Stop.

Какие мысли?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Torsten
Дата 30.7.2008, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 10.6.2008
Где: Pskov

Репутация: 3
Всего: 7



Вы на stlport тестируйте, там честнее будет для всех компиляторов, т.к. у студии собственная stl.
--------------------
We have no begining, we have no end. We are infinite.
PM MAIL   Вверх
andrew_121
Дата 30.7.2008, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(Torsten @  30.7.2008,  20:24 Найти цитируемый пост)
Вы на stlport тестируйте, там честнее будет для всех компиляторов, т.к. у студии собственная stl. 

Вот я и попытался...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 30.7.2008, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Народ, а че за фигня. Прописал пути:

Код

@echo off
set MINGW=C:/MinGW
set QMAKESPEC=win32-g++
set PATH=%QTDIR%/bin;%MINGW%/bin;c:/gdb/bin;%PATH%
set LIB=c:/stl/lib;%MINGW%/lib
set INCLUDE=c:/stl/stlport;%MINGW%/include;
cmd


Пытаюсь скомпилить так:

Код

g++ -O3 -o strstrings stlstrings.cpp -lstlport


Получаю: 

Код

C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: cannot fin
d -lstlport


Меняю на 

Код

g++ -O3 -o strstrings stlstrings.cpp -lstlport.5.1


Получаю 

Код

C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: cannot fin
d -lstlport.5.1


Меняю на:

Код

g++ -O3 -o strstrings stlstrings.cpp -L./LIB/ -lstlport.5.1


Опять не компилится. Меняю на полный путь:

Код

D:\Work\STLportStringTest>g++ -O3 -o strstrings stlstrings.cpp -Lc:/stl/lib -lst
lport.5.1


Компилиться. Почему линкер не видит ни переменную окружения LIB, ни косвенный путь через -L./LIB/ (даже -L../LIB пробывал с вариациями) ?
---

Ага, это спасает отца русской демократии:
Код

set LPATH=c:/stl/lib



Это сообщение отредактировал(а) SABROG - 30.7.2008, 23:51


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
SABROG
Дата 31.7.2008, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Вроде бы собрал STLPort для обоих компиляторов, а размеры классов почему-то не изменились также как и количество занимаемой памяти. Даже как в мануале прописал инклюд первым, видимо компилеры все-таки родной STL включают. Пол третьего ночи, сил уже нету...


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Mayk
Дата 31.7.2008, 05:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(SABROG @  31.7.2008,  05:25 Найти цитируемый пост)
видимо компилеры все-таки родной STL включают

Попробуй в STLPort'овском string'е прописать #error hello world.
если сообщение ошибке не вылетит - значит stl port не подключен. если вылетит - подключен


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
SABROG
Дата 31.7.2008, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(Mayk @ 31.7.2008,  05:24)
Цитата(SABROG @  31.7.2008,  05:25 Найти цитируемый пост)
видимо компилеры все-таки родной STL включают

Попробуй в STLPort'овском string'е прописать #error hello world.
если сообщение ошибке не вылетит - значит stl port не подключен. если вылетит - подключен

Прописал этот error в файле "string.h" STLPort'a, снес переменную окружения INCLUDE, прописал в переменной окружения PATH путь с инклюдами STLPort'a в самом начале. Не помогает, все-равно mingw берет старый и все нормально компилит.
---
Похоже при компиляции каждый раз нужно задавать непосредственные пути. Так error выдает, что говорит о том, что все-таки STLPort увиделся:

Код

g++ -mthreads -Ic:/stl/stlport -O3 -o stlpmingw stlstrings.cpp -Lc:/stl/stlport/lib -lstlport.5.1

---
Фух, собрал таки наконец. Итак 6 млн.ов классов std::string (STLPort) занимают в памяти:

msvc - 189 132kb (Родной STL - 235 716kb)
mingw -  188 912 kb (Родной STL - 141 896kb)

Пустой класс имеет размер 24 байта для обоих компиляторов.

6 млн.ов строк "hello, worldhello, worldhello, worldhello, worldhello, worldhello, worldhello, worldhello, worldhello, worldhello, worldhello, worldhello, worldhello, world" отнимают приблизительно 1 гиг и 200 мегов памяти и при этом разница между компиляторами не была больше 400кб.

Это сообщение отредактировал(а) SABROG - 31.7.2008, 08:55


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
andrew_121
Дата 31.7.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



SABROG - Вот ты упертый smile  Спасибо от всех читающих сею тему smile 
Я вот поразмыслил. В моем представлении строковый класс должен содержать что-то вроде:
Код

struct storage {
   char* str;
   int len;
   int reserved;
};

или
Код

struct storage {
   char* begin;
   char* end;
   char* endofstorage;
};

И это 12 байт. А на* еще 12 байт, и для чего их использовать...хз...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 31.7.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(andrew_121 @  31.7.2008,  12:17 Найти цитируемый пост)
А на* еще 12 байт


Дык я же писал, что у msvc 15 байт в резерве на строку. Т.е. по сути пустой экземпляр класса std::string это готовая строка размером в 15 байт, поэтому нет никакой разницы между пустым классом и заполненным, если строка меньше 15 символов. Делалось это, по видимому, для ускорения работы программы, чтобы не приходилось дополнительно выделять память под каждую строку в зависимости от длинны строки.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0628 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.