Алексей Asked:2020-11-05 04:52:25 +0000 UTC2020-11-05 04:52:25 +0000 UTC 2020-11-05 04:52:25 +0000 UTC 函数中变量的大小 772 如果类型很短(2 字节),为什么要为函数的可变参数分配 4 字节的 RAM? 根据 dgzargo 的要求 c++ 2 个回答 Voted Best Answer AnT stands with Russia 2020-11-05T10:09:33Z2020-11-05T10:09:33Z 首先,在这样的代码中,很可能根本不会为参数分配内存——参数将被放置在处理器寄存器中。 其次,即使您的实现决定在内存中分配参数,它也很可能将它们与您平台的本机单词边界或(更有可能)与类型边界对齐int。 具有类型边界对齐的变体的一个特性int是与 C 语言中调用未声明函数所采用的“旧”约定兼容:类型参数short生成类型参数int。这很可能是这种情况下的主要因素之一。与 C 的参数传递约定的兼容性几乎没有任何成本,而且只为 C++ 处理一些不必要的“参数打包”是没有意义的。 出于同样的原因,即使类型参数char也将作为 full-sized 传递int,类型参数float作为double. PS您不应该对为传输参数分配了多少内存感兴趣。不要紧。在函数内部,您的参数将表现得像 type 的值short,并且它们的初始值将被正确传递。 Andrey Sv 2020-11-06T06:23:51Z2020-11-06T06:23:51Z 在您的情况下,参数是通过堆栈传递的。而既然程序是三十二位的,那么栈量子是对应的。将参数传递给 Visual Studio 是 在此处和此处编写的。 在 x86 plashtorm 上,所有参数在传递时都被扩展为 32 位。 什么是堆栈帧以及放置什么以及如何放置在这里和这里。
首先,在这样的代码中,很可能根本不会为参数分配内存——参数将被放置在处理器寄存器中。
其次,即使您的实现决定在内存中分配参数,它也很可能将它们与您平台的本机单词边界或(更有可能)与类型边界对齐
int。具有类型边界对齐的变体的一个特性
int是与 C 语言中调用未声明函数所采用的“旧”约定兼容:类型参数short生成类型参数int。这很可能是这种情况下的主要因素之一。与 C 的参数传递约定的兼容性几乎没有任何成本,而且只为 C++ 处理一些不必要的“参数打包”是没有意义的。出于同样的原因,即使类型参数
char也将作为 full-sized 传递int,类型参数float作为double.PS您不应该对为传输参数分配了多少内存感兴趣。不要紧。在函数内部,您的参数将表现得像 type 的值
short,并且它们的初始值将被正确传递。在您的情况下,参数是通过堆栈传递的。而既然程序是三十二位的,那么栈量子是对应的。将参数传递给 Visual Studio 是 在此处和此处编写的。
什么是堆栈帧以及放置什么以及如何放置在这里和这里。