因此C语言有一个realloc()
过程,可以用来就地增长分配的[编辑]内存。
对于JVM/Java是否存在等价的概念?是否用于array
s或nio.buffer
s?我不介意这是JDK的一部分还是作为外部库,例如sun.unsafe
。
首先,C函数realloc
不是一个可以增长数组的工具,而是以前通过malloc
、calloc
或realloc
分配的内存。相反,C数组可能驻留在堆栈或静态存储器区域上,甚至可能嵌入到更大的结构中。
然后,该函数具有像free
那样使原始指针无效并返回新指针的语义。因此,如果你有指针的副本到处乱飞,你有责任用新的指针替换所有出现的东西。
当然,Java不支持使引用无效。保证每个非null
对象引用的有效性是Java内存管理的基本特性。
Public long allocateMemory(长字节)
Public long reallocateMemory(长地址、长字节)
public void freeMemory(长地址)
公共浮点getXyz(长地址)
公共无效putXyz(长地址,xyz x)
其中“XYZ”代表原始类型
如果要调整数组大小,请使用
array = Arrays.copyOf(array, newSize);
但是,如果array
是对特定数组的唯一引用,或者您的代码显然替换了所有现有引用,那么理论上,JVM可能启用就地调整大小操作,而不是复制内容,请参见运行JDK代码时Java JIT作弊吗?
但是检查必要的前提条件可能比复制数组内容的代价更高。我能想象到的唯一适用的场景是,如果数组是同一线程分配的最后一个对象,那么可以证明引用还没有转义,并且在分配空间内数组后面没有对象。
对于具有这种优化的JVM,当重复添加到arraylist
时,您可能会自动获得好处,因为该类确保它是对其内部数组的引用的唯一持有者,并且它在内部使用arrays.copyof
来调整大小。
从参考资料中,我发现: 类模板std::function是一个通用多态函数包装器。函数的实例可以存储、复制和调用任何可调用的目标函数、lambda表达式、绑定表达式或其他函数对象,以及指向成员函数的指针和指向数据成员的指针。 我不明白为什么应该能够存储这样的指针,而且我以前从未听说过这个功能。 真的有可能吗,我错过了什么或者是留档中的错误? 在这种情况下,
描述 (Description) C库函数void *realloc(void *ptr, size_t size)尝试调整先前通过调用malloc或calloc分配的ptr指向的内存块。 声明 (Declaration) 以下是realloc()函数的声明。 void *realloc(void *ptr, size_t size) 参数 (Parameters) ptr - 这是指向先前分配
例如,我们有一个数组: 现在我想创建d=5的数组的最大数量: array1: array2:
问题内容: 如果HashMap的键是字符串数组: 你可以使用新创建的字符串数组访问地图,还是必须是相同的String []对象? 问题答案: 它必须是同一对象。使用和的比较键只有在两个对象相同时才相等。 如果你想要的值相等,然后写一个包装了自己的容器类,并提供了相应的语义和。在这种情况下,最好使容器不可变,因为更改对象的哈希码会对基于哈希的容器类造成破坏。 编辑 正如其他人指出的那样,List 具
以下是我目前掌握的情况: 其中,我有一行,它应该取索引处的数组的值,并将其转换为长度为5的数组。因此,如果,它应该创建一个长度为5的数组。但是,它会抛出一个非法的表达式开始错误。 我也尝试使用临时变量来帮助声明多个数组,但是我得到了更多的错误以及表达式的非法开始。 有没有什么方法可以在不使用多维数组的情况下解决这个问题呢? 提前道谢。
任务给你一个排序的整数数组arr。它包含几个唯一的整数(负、正或零)。 您的任务是找到最大的d,使得a b c=d,其中a、b、c和d是arr的不同元素。如果没有找到这样的元素d,则返回null。 例子: 对于arr=[2,3,5,7,12],输出应该是12(这个数组正确传递了我的函数) 对于arr=[-100,-1,0,7,101],输出应该是0(这个不通过) 我可以进行正数检查,但我的函数因负