为什么QList对象的大小是4个字节?

时间:2018-02-13 22:13:55

标签: qt sizeof qlist

当尝试使用QList获取sizeof()对象的大小时,函数它给了我4个字节。 我试图改变列表中的项目数,它还给了4个字节? 我试图改变列表中项目的类型,再次给出了4个字节?

为什么项目数量或类型的变化不会影响对象大小?

2 个答案:

答案 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(或指针机器上的指针大小)。