相关疑难解决方法(0)

gcc的__attribute __((打包))/ #pragma包不安全吗?

在C中,编译器将按照声明它们的顺序布置结构的成员,在成员之间插入可能的填充字节,或者在最后一个成员之后插入,以确保每个成员正确对齐.

gcc提供了一种语言扩展,__attribute__((packed))它告诉编译器不要插入填充,允许结构成员不对齐.例如,如果系统通常要求所有int对象都具有4字节对齐,则__attribute__((packed))可能导致int在奇数偏移处分配struct成员.

引用gcc文档:

`packed'属性指定变量或结构字段应该具有尽可能小的对齐 - 变量的一个字节和字段的一个位,除非您使用`aligned'属性指定更大的值.

显然,使用此扩展可以导致更小的数据要求但代码更慢,因为编译器必须(在某些平台上)生成代码,以便一次一个字节地访问未对齐的成员.

但有任何不安全的情况吗?编译器是否始终生成正确(但速度较慢)的代码来访问打包结构的未对齐成员?在所有情况下都可以这样做吗?

c gcc pragma-pack

149
推荐指数
4
解决办法
11万
查看次数

在 C++ 中是否有与 C# Structs/StructLayout 具有字段偏移的等效功能?

以 C# 结构体为例:

    [StructLayout(LayoutKind.Explicit)]
    public struct Example
    {
        [FieldOffset(0x10)]
        public IntPtr examplePtr;

        [FieldOffset(0x18)]
        public IntPtr examplePtr2;

        [FieldOffset(0x54)]
        public int exampleInt;
    }
Run Code Online (Sandbox Code Playgroud)

我可以获取一个字节数组,并将其转换为这个结构,如下所示:

    public static T GetStructure<T>(byte[] bytes)
    {
        var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
        var structure = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
        handle.Free();
        return structure;
    }

    public static T GetStructure<T>(byte[] bytes, int index)
    {
        var size = Marshal.SizeOf(typeof(T));
        var tmp = new byte[size];
        Array.Copy(bytes, index, tmp, 0, size);
        return GetStructure<T>(tmp);
    }

    GetStructure<Example>(arrayOfBytes);
Run Code Online (Sandbox Code Playgroud)

C++ 中是否有等效的功能来获取字节数组并将其转换为结构,其中并非所有字节都用于转换(C# structlayout.explicit w/field offsets)?

希望做像下面这样:

struct {
  pad_bytes[0x10];
  DWORD64 …
Run Code Online (Sandbox Code Playgroud)

c# c++

5
推荐指数
1
解决办法
234
查看次数

标签 统计

c ×1

c# ×1

c++ ×1

gcc ×1

pragma-pack ×1