当尝试使用QList
获取sizeof()
对象的大小时,函数它给了我4个字节。
我试图改变列表中的项目数,它还给了4个字节?
我试图改变列表中项目的类型,再次给出了4个字节?
为什么项目数量或类型的变化不会影响对象大小?
答案 0 :(得分:3)
要获取列表中的项目数,请使用QList::size()
而不是sizeof()
。像这样:
QList<MyObject> list;
list.append(object1);
list.append(object2);
int size = list.size();
sizeof()
返回QList
类的大小,这通常是Qt类的情况,只由一个成员组成:指向私有结构的指针。假设您使用的是32位操作系统,则需要4个字节来存储地址,因此sizeof(list)
返回4的原因。
答案 1 :(得分:2)
/**
* WooCommerce Gravity Forms Add-on: Add support for removing a field from the product description in the cart.
* This handy code came from: https://gist.github.com/spivurno/6951662 as a result of this
* discussion: https://gravitywiz.com/how-to-hide-gravity-forms-product-fields/
*
* It's used to remove the calulational fields in product forms from the cart.
*/
class WooGFRemoveFieldFromProductDescription {
public function __construct() {
add_action( 'gform_field_advanced_settings', array( $this, 'field_settings_ui' ), 10, 2 );
add_action( 'gform_editor_js', array( $this, 'field_settings_js' ) );
add_filter( 'woocommerce_get_item_data', array( $this, 'modify_item_data' ), 11, 2 );
add_action( 'woocommerce_add_order_item_meta', array( $this, 'delete_order_item_meta' ), 11, 2 );
}
public function modify_item_data( $other_data, $cart_item ) {
$form_id = rgars( $cart_item, '_gravity_form_data/id' );
if( ! $form_id )
return $other_data;
$form = GFFormsModel::get_form_meta( $form_id );
foreach( $form['fields'] as $field ) {
if( ! rgar( $field, 'wgfrfEnable' ) )
continue;
//var_dump($other_data); //debug
//echo '<br>';
// reindex array for next loop
$other_data = array_values( $other_data );
for( $i = count( $other_data ) - 1; $i >= 0; $i-- ) {
if (isset($other_data[$i]['name'])){ //if not, must be a WC variation, not GF so ignore
if( $other_data[$i]['name'] == GFCommon::get_label( $field ) )
unset( $other_data[$i] );
}
}
}
return $other_data;
}
public function delete_order_item_meta( $item_id, $cart_item ) {
$form_id = rgars( $cart_item, '_gravity_form_data/id' );
if( ! $form_id )
return;
$form = GFFormsModel::get_form_meta( $form_id );
foreach( $form['fields'] as $field ) {
if( ! rgar( $field, 'wgfrfEnable' ) )
continue;
woocommerce_delete_order_item_meta( $item_id, GFCommon::get_label( $field ) );
}
}
public function field_settings_ui( $position ) {
if( $position != 450 )
return;
?>
<li class="wgfrf-enable-setting field_setting">
<input type="checkbox" id="wgfrf-enable" value="1" onclick="SetFieldProperty( 'wgfrfEnable', this.checked )">
<label class="inline" for="wgfrf-enable">
<?php _e( 'Remove This Field From WooCommerce Cart Item Description' ); ?>
</label>
</li>
<?php
}
public function field_settings_js() {
?>
<script type="text/javascript">
(function($) {
$(document).bind('gform_load_field_settings', function(event, field, form) {
$("#wgfrf-enable").attr( 'checked', field.wgfrfEnable == true );
});
for( inputType in fieldSettings ) {
if( fieldSettings.hasOwnProperty( inputType ) )
fieldSettings[inputType] += ', .wgfrf-enable-setting';
}
})(jQuery);
</script>
<?php
}
}
new WooGFRemoveFieldFromProductDescription();
为您提供对象本身的编译时大小,而不是它可能指向的数据。
sizeof
是一个包含指向数据结构的指针的类,该数据结构实际上包含指向堆分配数据的指针;在所有这些内容中,QList
只知道(并关心)第一位 - sizeof
只包含一个指针,因此它的大小为4个字节。
如果你这样做,那就是完全相同的原因
QList
无论设置int n;
std::cin>>n;
int *foo = new int[n];
std::cout<<sizeof(foo);
delete[] foo;
是什么,它总是会打印4(或指针机器上的指针大小)。