У меня есть этот код:
#include <iostream>
int main()
{
std::cout << sizeof(std::cout) << std::endl;
return 0;
}
Скомпилируйте это с g++ -g main.cpp
(это печатает 272 на моей ОС)
После этого я выполняю objdump --dwarf=info a.out
и увидеть следующую запись отладочной информации (умереть) для ostream
:
<2><c5a>: Abbrev Number: 41 (DW_TAG_class_type)
<c5b> DW_AT_name : (indirect string, offset: 0x5fa): basic_ostream<char, std::char_traits<char> >
<c5f> DW_AT_declaration : 1
<c60> DW_AT_sibling : <0xc77>
На самом деле ostream
это просто typedef для basic_ostream<char, std::char_traits<char>>
Die не содержит атрибут с размером (DW_AT_byte_size
) и я не могу понять почему. В исполняемом файле нет других штампов для класса ostream, но компилятор должен знать размер этого класса (он печатает размер с sizeof
). Итак, мой вопрос: как я могу получить правильный размер для ostream
класс из карликовой информации с objdump
,
Согласно спекуляция DW_AT_Declaration указывает, что DIE описывает описание, а не определение; вам нужно посмотреть в объектном файле, который содержит определение.
Независимая от языка утилита objdump сбрасывает символы в объектный файл. std :: ostream — это класс, а не объект.
Объект std :: cout происходит из библиотеки C ++. Используйте obdjump в libstdc ++., Чтобы найти std :: cout.