【问题标题】:How is @Array(length= ?) Annotation in OpenHFT/Chronicle-Values Used如何使用 OpenHFT/Chronicle-Values 中的 @Array(length= ?) 注解
【发布时间】:2016-09-08 11:36:50
【问题描述】:

这个问题是关于Chronicle-Values

在网站上找到的一个例子是:

interface SomeStats {
    @Array(length=100)
    long getPercentFreqAt(int index);
    void setPercentFreqAt(int index, long percentFreq);
    long addPercentFreqAt(int index, long addition);
}

这里的注解只适用于其中一种方法。这是否意味着之后的所有方法都被视为处理数组数据?

one of the test 我发现的案例中

package net.openhft.chronicle.values;

public interface HasArraysInterface {
    @Array(length = 4)
    void setFlagAt(int idx, boolean flag);

    boolean getFlagAt(int idx);

    @Array(length = 4)
    void setByteAt(int idx, byte b);

    byte getByteAt(int idx);

    @Array(length = 4)
    void setShortAt(int idx, short s);

    short getShortAt(int idx);

    @Array(length = 4)
    void setCharAt(int idx, char ch);

    char getCharAt(int idx);

    @Array(length = 4)
    void setIntAt(int idx, int i);

    int getIntAt(int idx);

    @Array(length = 4)
    void setFloatAt(int idx, float f);

    float getFloatAt(int idx);

    @Array(length = 4)
    void setLongAt(int idx, long l);

    long getLongAt(int idx);

    @Array(length = 4)
    void setDoubleAt(int idx, double d);

    double getDoubleAt(int idx);

    @Array(length = 4)
    void setStringAt(int idx, @MaxUtf8Length(8) String s);

    String getStringAt(int idx);
}

我从中了解到的是,您可以在此接口中拥有多个数组,其中@Array(length = 4) 适用于以At 结尾的方法,直到下一个注释。是这样吗?

此外,您是否可以使用以下内容来模拟 4 个双精度数组和 8 个字符串数组:

    @Array(length = 4)
    void setDoubleAt(int idx, double d);

    double getDoubleAt(int idx);

    @Array(length = 8)
    void setStringAt(int idx, @MaxUtf8Length(8) String s);

    String getStringAt(int idx);

在一个接口内分配多个@Array(length= ?)的多个数组的内存布局是什么?您可以在面向列或面向行的布局之间进行选择吗?如果length 不同,布局将如何处理?

也代替:

interface SomeStats {
    @Array(length=100)
    long getPercentFreqAt(int index);
    void setPercentFreqAt(int index, long percentFreq);
    long addPercentFreqAt(int index, long addition);
}

你能不能写成:

@Array(length=100)
interface SomeStats {
    long getPercentFreqAt(int index);
    void setPercentFreqAt(int index, long percentFreq);
    long addPercentFreqAt(int index, long addition);
}

暗示@Array(length=100)适用于整个界面。

您还可以推迟指定长度直到创建点吗?

【问题讨论】:

    标签: java arrays memory-management chronicle


    【解决方案1】:
    1. 这里的注解只适用于其中一种方法。这是否意味着之后的所有方法都被视为处理数组数据?

    来自@Array javadoc

    此注解必须放在访问数组元素的单个方法上:getter、setter 或 adder 等。

    我。 e. @Array 应该放在 one (any) 方法上,访问一个字段。 “字段”由标准访问器方法和名称定义,即。 e.在您的示例中,在SomeStats 值接口中,有一个名为PercentFreq 的(数组)字段。如果您将getAnotherField()setAnotherField() 之类的方法添加到此接口,它将是一个单独的字段,@Array 注释不适用,即。 e.这将是一个“标量”字段,除非您将@Array 放在getAnotherField()setAnotherField() 上,并在这些方法中添加int index 参数和-At 后缀。

    2.

    我从中了解到的是,您可以在此接口中拥有多个数组,其中 @Array(length = 4) 适用于以 At 结尾的方法,直到下一个注释。是这样吗?

    不,不是“直到下一个注释”。注释应用于字段。字段访问器方法(由字段名称标识)可以在接口定义中按任何顺序排列。

    3.

    在一个接口中分配多个@Array(length= ?) 的多个数组的内存布局是什么?您可以在面向列或面向行的布局之间进行选择吗?如果长度不同,布局如何处理?

    在您的示例中,布局将是:

    Double element 0 (8 bytes)
    Double element 1 (8 bytes)
    Double element 2 (8 bytes)
    Double element 3 (8 bytes)
    String element 0 (9 bytes: 1 bytes to encode size + 8 bytes of reserved space)
    ...
    String element 7 (9 bytes)
    

    要进行基于行的对齐,您应该定义另一个接口:

    interface Row {
        void setDouble(double d);
        double getDouble();
    
        void setString(@MaxUtf8Length(8) String s);
        String getString();
    }
    

    然后定义数组或行:

    interface MyTopInterface {
        @Array(length=8)
        void setRowAt(int index, Row row);
        Row getRowAt(int index);
    }
    

    这将与“面向列”布局一样有效并占用相同数量的内存。 Read about nested structures in the tutorial.

    4.

    暗示@Array(length=100) 适用于整个界面。

    你不能这样做,使用上面建议的模式(嵌套接口)

    5.

    您还可以推迟指定长度直到创建点吗?

    不,Chronicle Values 的整个想法是它们的总大小是静态已知的。

    【讨论】:

      【解决方案2】:

      数组长度是必需的,因为空间是就地分配的。当您指定长度为 N 时,这意味着您只能拥有索引 0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-18
        • 2010-12-13
        • 2010-10-11
        • 2014-01-08
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        相关资源
        最近更新 更多