Разница между amd64 и i386 заключается в том, что amd64 является 64-разрядным, а i386 - 32-разрядным . Это ширина (в битах) регистров, доступных в ядре.
По сути, наибольшее число, которое 32-разрядное ядро процессора может обработать за один раз, составляет чуть более 4,29 миллиарда, в то время как 64-разрядное ядро может обрабатывать чуть более 18,44 миллиарда миллиардов.
Ядра современных ПК могут работать как 64-разрядный или 32-разрядный процессор, в зависимости от того, какую версию операционной системы вы установили.
64-разрядный код имеет тенденцию работать быстрее, чем 32-разрядный код, либо потому, что он может работать с большими числами на ходу, либо потому, что 64-разрядные ядра имеют больше регистров, поэтому могут хранить больше вещей без необходимости помещать их во внешнюю память. Хотя нет никакой гарантии, что 64-битный код будет работать быстрее, если код не был написан для использования дополнительных возможностей процессора.
Компиляция в 32-битной системе даст код, отличный от 64-битной системы. Вы можете доказать это, скомпилировав код ассемблера в двух системах. Предполагая, что ваш C-файл - myfile.c, попробуйте gcc -S myfile.c
в обеих системах сравнить myfile.s
Хорошо написанный код для 32-разрядной системы должен компилироваться и выполняться в 64-разрядной системе, но не весь код написан хорошо. Многие программисты делают предположения о системе, которые могут быть неверными: например, ширина регистра или порядок байтов.
Без доступа к исходному коду трудно понять, в чем проблема, но segmenation fault
указывает, что была сделана попытка получить доступ к памяти, которая не принадлежит программе. Это может, например, указывать на то, что mem_ptr является 32-битным указателем, что хорошо в 32-битной системе, но должно быть 64-битным указателем в 64-битной системе.