Следующее является некоторым текстом от онлайн-курса, который я беру:
класс BufferedStream является реальным классом, который расширяет Потоковый класс и используется для обеспечения дополнительного буфера памяти другому типу потока, и синхронно и асинхронно. Класс BufferedStream должен быть настроен для или чтения или записать, когда экземпляр класса создается, но BufferedStream не может быть настроен для выполнения обоих задачи одновременно.
Microsoft улучшила производительность всех потоков в Платформе.NET включением встроенного буфера. Производительность, заметно улучшенная путем применения BufferedStream к существующим потокам, таким как FileStream или MemoryStream. Применение BufferedStream к существующему потоку Платформы.NET приводит к двойному буферу.
наиболее распространенное приложение класса BufferedStream находится в пользовательских потоковых классах, которые не включают встроенный буфер.
В раздел .eh_frame
входят дескрипторы раскрутки, которые вам нужны только для раскрутки стека (например, с помощью GDB). Изучая сборку, вы можете просто игнорировать ее. Вот способ «очистки», который вы хотите:
gcc -S -o - test.c | sed -e '/^\.L/d' -e '/\.eh_frame/Q'
.file "test.c"
.text
.globl main
.type main,@function
main:
pushq %rbp
movq %rsp, %rbp
movl $0, %eax
leave
ret
.size main,.Lfe1-main
Вы можете попробовать поместить код, который хотите изучить, в функцию.
Например:
int ftest(void)
{
return 0;
}
int main(void)
{
return ftest();
}
Если вы посмотрите на исходный код сборки для тестирования, он будет настолько чистым, насколько вам нужно .
..snip..
test:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl $0, %eax
leave
ret
..snip..
Я обнаружил, что использование флага -Os
проясняет ситуацию. Я пробовал использовать ваш крошечный пример, но это мало что изменило.
Тем не менее, я помню, что это было полезно, когда я изучал ассемблер (на Sparc).