Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2012, 01:00   #1
9esa
Пользователь
 
Регистрация: 26.02.2012
Сообщений: 20
По умолчанию Объект String в памяти

Добрый день.
Я немного не понимаю как объект типа string передается в функцию, интересует как это делается в памяти
Код:
    string dddww,wwqeyu;
	dddww="aaaajndjlngdblnblfbnlbnzvcvcc";
	wwqeyu="29";
	wtte(dddww);
	wtte(wwqeyu);
Сначала компилятор делает
string dddww;
Он вызывает функцию void (bool) c именем шаблона класса string
Далее он записывает нашу строку начиная с определенного адреса.
При вызове функции в качестве аргумента передается шаблон такой же как и при создании объекта.
Если смотреть на адрес где лежит функция, через 4 байта лежит адрес, как я понял начала объекта , где располагается размер строки в памяти т.к. строка меньше 16 символов располагается, ниже на 4 байта , а более располагается по ссылки

Последний раз редактировалось 9esa; 24.04.2012 в 13:47.
9esa вне форума Ответить с цитированием
Старый 24.04.2012, 01:26   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

О чем Вы?

wtte это функция у Вас? И она имеет сигнатуру void (bool) ?
Тогда приведенный код вообще не скомпилируется.
EUGY вне форума Ответить с цитированием
Старый 24.04.2012, 01:51   #3
9esa
Пользователь
 
Регистрация: 26.02.2012
Сообщений: 20
По умолчанию

wtte это просто функция которая принимает в качестве аргумента string строку .
а когда ты пишешь строку string a; вызывается функция void(bool)
9esa вне форума Ответить с цитированием
Старый 24.04.2012, 01:59   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
а когда ты пишешь строку string a; вызывается функция void(bool)
???

Когда я пишу string a; вызывается конструктор класса.
EUGY вне форума Ответить с цитированием
Старый 24.04.2012, 03:10   #5
9esa
Пользователь
 
Регистрация: 26.02.2012
Сообщений: 20
По умолчанию

Хм.... Почитай внимательно тогда , что происходит.
std::basic_string<char,std::char_tr aits<char>,std::allocator<char> > void (bool);
Тебе эта строчка не знакома?
Далее когда ты вызываешь функцию передавая строку в качестве аргумента происходит вот такая вещь
NameFunction(std::basic_string<char ,std::char_traits<char>,std::alloca tor<char> >);
9esa вне форума Ответить с цитированием
Старый 24.04.2012, 03:45   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Далее когда ты вызываешь функцию передавая строку в качестве аргумента
Где эта функция, какой тип параметра у нее?

Если речь идет о стандартном классе <string>, то при объявлении идет вызов конструктора класса string, который является псевдонимом для шаблонного класса basic_string.
Он в свою очередь является наследником
class basic_string : public _String_val <...>
class String_val: public _String_base
Соответственно идут вызовы конструкторов этих классов.

Вопрос- то в чем? Где именно хранится строка?
Здесь:

Код:
class basic_string :.....
{
//....
protected:
union _Bxty
{	// storage for small buffer or pointer to larger one
_Elem _Buf[_BUF_SIZE];
_Elem *_Ptr;
} _Bx;

Последний раз редактировалось EUGY; 24.04.2012 в 04:07.
EUGY вне форума Ответить с цитированием
Старый 24.04.2012, 13:53   #7
9esa
Пользователь
 
Регистрация: 26.02.2012
Сообщений: 20
По умолчанию

Интересует, как это реализовано в памяти. Точнее хотелось бы узнать, как можно находить нашу строку в памяти зная только вершину стека нашей функции.
9esa вне форума Ответить с цитированием
Старый 24.04.2012, 19:54   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Точнее хотелось бы узнать, как можно находить нашу строку в памяти зная только вершину стека нашей функции.
Стек функции здесь совершенно не причем.

Для простоты положим, что юникод отключен и используются анси -строки.

Имеем адрес объекта F, класса string.
Прибавляя к адресу четыре байта, получаем адрес защищенного члена _Bx
В зависимости от длины, строка хранится либо в поле _Buf, либо в поле _Ptr.
То есть по смещению в четыре байта от адреса переменной хранится либо указатель строки, либо указатель-на-указатель.
Код:
	std::string F;

	F = "qwerty";
	void* adr = &F;
	if (F.length() < 16)
		std::cout << (char*)adr + 4;
	else
		std::cout << *(char**)((char*)adr + 4);

Последний раз редактировалось EUGY; 24.04.2012 в 19:57.
EUGY вне форума Ответить с цитированием
Старый 25.04.2012, 00:34   #9
9esa
Пользователь
 
Регистрация: 26.02.2012
Сообщений: 20
По умолчанию

К сожалению причем, я работаю над программой которая подключается в виде динамической библиотеке к отдельному проекту , и позволяет при каждом вызове функции копировать все значения передаваемые в неё. При каждом вызове я могу получить информацию о передаваемых значениях и возвращаемых.Со структурами и классами все просто как и с обычными типами. А вот со стрингом не так все просто, из-за того , что я имею только функцию , и указатель на начало объекта типа стринг в памяти. Если знать размерность строки то проблем не возникает, только вот размерность не узнать.
9esa вне форума Ответить с цитированием
Старый 25.04.2012, 00:47   #10
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Если имеешь указатель на начало объекта, то имеешь и сам объект.
Не понимаю, в чем проблема.

Код:
void func(void* someptr)
{
   string* pmystr =  (string*) someptr;
   int len = pmystr->length(); 
}
EUGY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс string, выделение памяти Стремящийся Общие вопросы C/C++ 1 17.03.2012 14:21
выделение памяти под объект VIK_aka_TOR Общие вопросы Delphi 4 15.02.2012 19:20
Загрузить текст из file.txt в объект String apromix JavaScript, Ajax 3 10.10.2011 09:06
Шаблоны - нужно создать объект класса abc в котором вместо aa использовался бы объект класса fff? Farrel Общие вопросы C/C++ 2 13.11.2010 17:37
Как получить адрес String строки или преобразовать String madboy4ik Общие вопросы по Java, Java SE, Kotlin 6 15.01.2010 11:57