Да, вы можете сделать это, конечно, при условии, что вы правильно используете соглашение о вызовах, чтобы данные были полностью очищены от любых областей стека, которые код C ++ использует в качестве стека.Память стека - это просто память, и что касается кода, получающего этот указатель, то нет никакой разницы между помещением некоторых значений в стек или перемещением указателя стека (т.е. созданием массива / структуры в стеке) и последующей записью значенийв пространство, которое вы создали, или просто динамически выделяя некоторую память и помещая значения. Ваши инструкции по вставке ассемблера помещают значения туда в какой-то конкретный макет, и все.,Например, в x86 два 32-битных int
значения рядом точно такие же , что и 64-битное long long
значение.Вот почему соглашения о вызовах определяют расположение параметров в стеке и требуют, чтобы вызывающий и вызываемый оба знали (и соглашались) порядок и типы параметров.
Конечно, вы можете предоставить дополнительную информацию, которая позволяетвызываемый для разработки типов данных.Например, первый параметр printf
является (указателем) строки формата, и, анализируя строку формата, вызываемый абонент знает, какие типы оставшихся параметров есть для этого конкретного вызова, а затем может прочитать их, используя varargs.макросы.