नहीं, आप इसे बदल नहीं सकते हैं। इसके कार्यान्वयन को देखने से आप क्या सीखना चाहते हैं?
sizeof
अधिक बुनियादी परिचालनों का उपयोग कर सी ++ में लिखा नहीं जा सकता है। यह एक फ़ंक्शन नहीं है, या लाइब्रेरी हेडर का हिस्सा उदा। printf
या malloc
। यह कंपाइलर के अंदर है।
संपादित करें: संकलक ही सी या सी ++ में लिखा है, तो आप इस तरह कार्यान्वयन कुछ किया जा रहा है के बारे में सोच सकते हैं:
size_t calculate_sizeof(expression_or_type)
{
if (is_type(expression_or_type))
{
if (is_array_type(expression_or_type))
{
return array_size(exprssoin_or_type) *
calculate_sizeof(underlying_type_of_array(expression_or_type));
}
else
{
switch (expression_or_type)
{
case int_type:
case unsigned_int_type:
return 4; //for example
case char_type:
case unsigned_char_type:
case signed_char_type:
return 1;
case pointer_type:
return 4; //for example
//etc., for all the built-in types
case class_or_struct_type:
{
int base_size = compiler_overhead(expression_or_type);
for (/*loop over each class member*/)
{
base_size += calculate_sizeof(class_member) +
padding(class_member);
}
return round_up_to_multiple(base_size,
alignment_of_type(expression_or_type));
}
case union_type:
{
int max_size = 0;
for (/*loop over each class member*/)
{
max_size = max(max_size,
calculate_sizeof(class_member));
}
return round_up_to_multiple(max_size,
alignment_of_type(expression_or_type));
}
}
}
}
else
{
return calculate_sizeof(type_of(expression_or_type));
}
}
नोट है कि बहुत ज्यादा छद्म कोड है। ऐसी कई चीजें हैं जिनमें मैंने शामिल नहीं किया है, लेकिन यह सामान्य विचार है। संकलक शायद वास्तव में ऐसा नहीं करता है।यह संभवतः sizeof(X)
लिखते समय पुन: गणना करने के बजाय, किसी प्रकार के आकार (कक्षा सहित) के आकार की गणना करता है। इसे उदाहरण के लिए भी अनुमति है पॉइंटर्स अलग-अलग आकार होते हैं जो वे इंगित करते हैं।
क्या संभावित उपयोग आप इस तरह के एक परिदृश्य के लिए हो सकता था? – Mikeage
वाह, ओवरलोडिंग आकार के कारण होने वाली क्षति के बारे में सोचें :-) – paxdiablo
मेरा इरादा सिर्फ आकार के ऑपरेटर के आंतरिक कार्यान्वयन को देखने के लिए है। – anand