FIELD_OFFSET宏的使用

本文深入探讨了C++中使用#define FIELD_OFFSET宏获取结构体成员偏移地址的过程,通过实例展示了内存对齐的影响,并解释了宏的具体实现逻辑。

今天阅读代码发现有这么个东西,查了google,看了一些文章,自己动手试验了一下,对此有了些了解,记录一下

#define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field))

这个宏是用来取结构体或类里面成员的偏移地址。

例如:

class CTest
{
public:
    int a;
    int b;
};
int offset = FIELD_OFFSET(CTest,b);



结果 offset 为 4;

这个时候我们可以顺便看一下内存对齐的问题,我们把类改一下

class CTest
{
public:
    char c;
    int a;
    int b;
};
int offset = FIELD_OFFSET(CTest,b);
结果不是5,是8

SEARCH_CAR_INDEX_ENTRY *car_info = (SEARCH_CAR_INDEX_ENTRY *)obj_info; SMART_DATA_OI_VEHICLE_RECOGNITION_VALUE_S value = { .type_sedan = car_info->car_attr[SMART_FIELD_TYPE_SEDAN], .type_suv = car_info->car_attr[SMART_FIELD_TYPE_SUV], .type_bus = car_info->car_attr[SMART_FIELD_TYPE_BUS], .type_microbus = car_info->car_attr[SMART_FIELD_TYPE_MICROBUS], .type_truck = car_info->car_attr[SMART_FIELD_TYPE_TRUCK], .color_white = car_info->car_attr[SMART_FIELD_COLOR_WHITE], .color_gray = car_info->car_attr[SMART_FIELD_COLOR_GRAY], .color_black = car_info->car_attr[SMART_FIELD_COLOR_BLACK], .color_red = car_info->car_attr[SMART_FIELD_COLOR_RED], .color_brown = car_info->car_attr[SMART_FIELD_COLOR_BROWN], .color_blue = car_info->car_attr[SMART_FIELD_COLOR_BLUE], .color_green = car_info->car_attr[SMART_FIELD_COLOR_GREEN], .color_yellow = car_info->car_attr[SMART_FIELD_COLOR_YELLOW], .color_special = car_info->car_attr[SMART_FIELD_COLOR_SPECIAL], .timestamp_start = car_info->start_time, .timestamp_end = car_info->end_time, }; if (0 != car_info->snapLen) { value.thumb = (U8 *)car_info + sizeof(SEARCH_CAR_INDEX_ENTRY); value.thumb_len = car_info->snapLen; }能否像这样去解析else if (motion.obj_type == SMART_DATA_OBJECT_TYPE_VEHICLE) { SMART_DATA_OI_VEHICLE_RECOGNITION_VALUE_S *vehicle = malloc(sizeof(*vehicle)); vehicle->type_sedan = *(p_buf + offset++); memcpy(&vehicle->timestamp_start, p_buf + offset, sizeof(uint64_t)); vehicle->timestamp_start = be64toh(vehicle->timestamp_start); offset += sizeof(uint64_t); memcpy(&vehicle->timestamp_end, p_buf + offset, sizeof(uint64_t)); vehicle->timestamp_end = be64toh(vehicle->timestamp_end); offset += sizeof(uint64_t); memcpy(&vehicle->thumb_len, p_buf + offset, sizeof(uint32_t)); vehicle->thumb_len = ntohl(vehicle->thumb_len); offset += sizeof(uint32_t); if (vehicle->thumb_len > 0) { vehicle->thumb = malloc(vehicle->thumb_len); memcpy(vehicle->thumb, p_buf + offset, vehicle->thumb_len); offset += vehicle->thumb_len; } recognition = vehicle; thumb_len = vehicle->thumb_len; thumb = vehicle->thumb; start_time = vehicle->timestamp_start; end_time = vehicle->timestamp_end; special_attr = vehicle->type_sedan;
最新发布
10-18
struct AP4_AvcSequenceParameterSet { AP4_AvcSequenceParameterSet(); void GetInfo(unsigned int& width, unsigned int& height, float& fps); AP4_DataBuffer raw_bytes; unsigned int profile_idc; unsigned int constraint_set0_flag; unsigned int constraint_set1_flag; unsigned int constraint_set2_flag; unsigned int constraint_set3_flag; unsigned int level_idc; unsigned int seq_parameter_set_id; unsigned int chroma_format_idc; unsigned int separate_colour_plane_flag; unsigned int bit_depth_luma_minus8; unsigned int bit_depth_chroma_minus8; unsigned int qpprime_y_zero_transform_bypass_flag; unsigned int seq_scaling_matrix_present_flag; AP4_AvcScalingList4x4 scaling_list_4x4[6]; bool use_default_scaling_matrix_4x4[AP4_AVC_SPS_MAX_SCALING_LIST_COUNT]; AP4_AvcScalingList8x8 scaling_list_8x8[6]; unsigned char use_default_scaling_matrix_8x8[AP4_AVC_SPS_MAX_SCALING_LIST_COUNT]; unsigned int log2_max_frame_num_minus4; unsigned int pic_order_cnt_type; unsigned int log2_max_pic_order_cnt_lsb_minus4; unsigned int delta_pic_order_always_zero_flags; int offset_for_non_ref_pic; int offset_for_top_to_bottom_field; unsigned int num_ref_frames_in_pic_order_cnt_cycle; int offset_for_ref_frame[AP4_AVC_SPS_MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE]; unsigned int num_ref_frames; unsigned int gaps_in_frame_num_value_allowed_flag; unsigned int pic_width_in_mbs_minus1; unsigned int pic_height_in_map_units_minus1; unsigned int frame_mbs_only_flag; unsigned int mb_adaptive_frame_field_flag; unsigned int direct_8x8_inference_flag; unsigned int frame_cropping_flag; unsigned int frame_crop_left_offset; unsigned int frame_crop_right_offset; unsigned int frame_crop_top_offset; unsigned int frame_crop_bottom_offset; unsigned int vui_parameters_present_flag; AP4_VuiParameterSet vui; }; struct AP4_AvcPictureParameterSet { AP4_AvcPictureParameterSet(); AP4_DataBuffer raw_bytes; unsigned int pic_parameter_set_id; unsigned int seq_parameter_set_id; unsigned int entropy_coding_mode_flag; unsigned int pic_order_present_flag; unsigned int num_slice_groups_minus1; unsigned int slice_group_map_type; unsigned int run_length_minus1[AP4_AVC_PPS_MAX_SLICE_GROUPS]; unsigned int top_left[AP4_AVC_PPS_MAX_SLICE_GROUPS]; unsigned int bottom_right[AP4_AVC_PPS_MAX_SLICE_GROUPS]; unsigned int slice_group_change_direction_flag; unsigned int slice_group_change_rate_minus1; unsigned int pic_size_in_map_units_minus1; unsigned int num_ref_idx_10_active_minus1; unsigned int num_ref_idx_11_active_minus1; unsigned int weighted_pred_flag; unsigned int weighted_bipred_idc; int pic_init_qp_minus26; int pic_init_qs_minus26; int chroma_qp_index_offset; unsigned int deblocking_filter_control_present_flag; unsigned int constrained_intra_pred_flag; unsigned int redundant_pic_cnt_present_flag; }; struct AP4_AvcSliceHeader { AP4_AvcSliceHeader(); unsigned int size; // not from the bitstream, this is computed after parsing unsigned int first_mb_in_slice; unsigned int slice_type; unsigned int pic_parameter_set_id; unsigned int colour_plane_id; unsigned int frame_num; unsigned int field_pic_flag; unsigned int bottom_field_flag; unsigned int idr_pic_id; unsigned int pic_order_cnt_lsb; int delta_pic_order_cnt[2]; unsigned int redundant_pic_cnt; unsigned int direct_spatial_mv_pred_flag; unsigned int num_ref_idx_active_override_flag; unsigned int num_ref_idx_l0_active_minus1; unsigned int num_ref_idx_l1_active_minus1; unsigned int ref_pic_list_reordering_flag_l0; unsigned int reordering_of_pic_nums_idc; unsigned int abs_diff_pic_num_minus1; unsigned int long_term_pic_num; unsigned int ref_pic_list_reordering_flag_l1; unsigned int luma_log2_weight_denom; unsigned int chroma_log2_weight_denom; unsigned int cabac_init_idc; unsigned int slice_qp_delta; unsigned int sp_for_switch_flag; int slice_qs_delta; unsigned int disable_deblocking_filter_idc; int slice_alpha_c0_offset_div2; int slice_beta_offset_div2; unsigned int slice_group_change_cycle; unsigned int no_output_of_prior_pics_flag; unsigned int long_term_reference_flag; unsigned int difference_of_pic_nums_minus1; unsigned int long_term_frame_idx; unsigned int max_long_term_frame_idx_plus1; }; 注释上述代码
09-25
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值