Tag: 指针

了解如何使用TheUnsafe进行memcpy

我阅读了有关TheUnsafe的内容,但我感到困惑的是,与C / C ++不同,我们必须计算出东西的偏移量,还有32位VM与64位VM,它们可能有也可能没有不同的指针大小取决于在特定的VM设置打开或关闭(同样,我假设数据的所有偏移实际上基于指针算法,这将影响他们)。 不幸的是,似乎有关如何使用TheUnsafe的所有内容仅仅来自一篇文章(恰好是第一篇),而其他所有文章都是从某种程度上粘贴的。 其中不存在很多,有些不清楚,因为作者显然不会说英语。 我的问题是: 如何使用TheUnsafe找到字段的偏移量+指向拥有该字段(或字段的字段,字段,字段的字段,字段的字段…)的实例的指针的偏移量 如何使用它来执行memcpy到另一个指针+偏移内存地址 考虑到数据的大小可能有几GB,并且考虑到堆不提供对数据对齐的直接控制,并且它可能肯定是碎片化的,因为: 1)我认为没有什么能阻止VM在offset + 10处分配field1而在offset sizeof(field1)+ 32处分配field2,是吗? 2)我还假设GC会移动大块数据,导致1GB大小的字段有时会碎片化。 那么我所描述的memcpy操作是否可行? 如果数据由于GC而碎片化,那么堆当然有一个指向下一个数据块的位置的指针,但是使用上述简单的过程似乎并没有涵盖这一点。 所以数据必须在堆外(这可能)工作吗? 如果是这样,如何使用TheUnsafe分配堆外数据,使这些数据作为一个实例的字段工作,当然一旦完成就释放分配的内存? 我鼓励任何不太了解这个问题的人询问他们需要知道的具体细节。 我还敦促人们不要回答,如果他们的想法是“将你需要的所有对象复制到数组中并使用System.arraycopy 。我知道在这个精彩的论坛中通常的做法,而不是回答所提出的问题,提供一个完整的替代解决方案,原则上与原始问题无关,除了它完成相同的工作。 最好的祝福。

SWIGTYPE_p_p_:结构指针上的指针(从C / C ++到Java)

我正在使用Swig生成Java类。 我需要处理结构上指针的指针 。 我有这个结构: struct Model { uint32_t serial; } 我在C / C ++中有一个需要包装的函数: void getModel( Model ** model ){ // instructions… } 我得到这个Java类的结果: public class SWIGTYPE_p_p_Model { private long swigCPtr; protected SWIGTYPE_p_p_Model(long cPtr, boolean futureUse) { swigCPtr = cPtr; } protected SWIGTYPE_p_p_Model() { swigCPtr = 0; } protected static long getCPtr(SWIGTYPE_p_p_Model obj) { return […]

Java和对象,数组和基元类型的精确引用大小

我想知道对象在内存中分配的真实空间。 我尝试用一​​些例子来解释:使用64位JVM,指针大小应该是8个字节,所以: Object singletest = new Object(); 将占用8个字节来引用Object加上Object的大小 Object arraytest = new Object[10]; 将需要8个字节来引用存储数组的位置加上8 * 10个字节来存储数组加上每个Object的大小 int singleint = new int; 将只占用2个字节,因为int是基本类型 int[] arrayint = new int[10]; 将占用8个字节来引用位置,并使用10 * 2个字节作为元素 而且,这就是为什么Java允许编写这样的代码的原因: int[][] doublearray = new int[2][]; int[0][] = new int[5]; int[1][] = new int[10]; 真正发生的是数组会像对象一样产生一个引用(也就是指针),所以在声明时它并不重要第二维的大小(维度可能不同,它们之间没有链接)。 然后所采用的空间将是:对doublearray (8字节)的引用,第一维只是对第二维的引用,所以其他8字节* 2(第一维尺寸),最后是2字节* 5加2字节* 10 。 所以,最后,如果有一个像这样的真正的类: class Test { […]

指针如何在Java中使用原始类型?

我正在阅读什么是NullPointerException,我该如何修复它? 在接受的答案中,我读到了一些我不太了解的内容: int x; x = 10; 在这个例子中,变量x是一个int,Java会将它初始化为0。 当您在第二行中将其分配给10时,您的值10将被写入x指向的内存位置。 我想原始类型,变量是实际值的内存地址; 对于复杂类型,变量仅仅是指向实际值的指针的内存地址。 但上面引用的答案告诉我,我错了。 它说“x指向的内存位置”。 因此,如果x指向存储实际值的内存地址,那么原始类型与复杂类型的不同之处是什么? 我不知道原始类型甚至有指针。 指针如何与原始类型一起使用?

将OpenCV矩阵循环转换为JavaCV

不久前得到了O’Reilly的“学习OpenCV”一书,从那以后我一直在忙着将我看到的所有示例代码从OpenCV转换为JavaCV,通常也会进行一些我自己的修改。 我一直试图尽可能地保持纯OpenCV(C语言)代码并避免使用Java。 例如,我直接通过JavaCV中的OpenCV highgui包实现了所有的接口元素,而不是通过Java Swing。 通过这样做,我希望以相对较短的顺序学习OpenCV库和一些C,以及建立一个有用的函数库,如果我决定稍后切换到纯OpenCV,我将能够轻松地转换为C. 无论如何,我对C知之甚少,有时在处理指针时遇到麻烦。 本书推荐使用以下代码作为迭代3通道矩阵的最佳方法: float sum( const CvMat* mat ) { float s = 0.0f; for(int row=0; rowrows; row++ ) { const float* ptr = (const float*)(mat->data.ptr + row * mat->step); for( col=0; colcols; col++ ) { s += *ptr++; } } return( s ); } 以下是此代码的附加说明: 在将指针计算到矩阵中时,请记住矩阵元素数据是联合。 因此,在取消引用此指针时,必须指示union的正确元素才能获得正确的指针类型。 然后,要设置该指针,必须使用矩阵的step元素。 如前所述,step元素以字节为单位。 […]

从Java角度看C指针和数组的教程

我现在是大学新生,主修CS。 我刚刚完成了“计算机程序设计入门”课程。 我喜欢它,觉得我学到了很多东西。 几天前,我读了乔尔的“Java学校的危险” 。 “链接列表?” 我想,“那些都不是很难。我们已经完成了一些已经上课的人。” 这是正确的,因为在Java中,它们并不那么难。 但无论如何,我试着用C语言写一个。 它太难了! Joel是对的,我认为…… Java为你处理了许多小小的东西,它真的不那么难。 但我决心克服我学校的Java-tude并学习如何在C中写下这个dang链表。 所以我想,有人问,有没有人知道学习C的好(和免费)在线教程,而不是试图提出很多很小的问题。 具体来说,学习如何处理指针,以及所有这些符号( & , * , ** , []以及它们如何协同工作)我想我已经非常精通Java了,所以我不需要关于如何写“Hello,World!”的教程 程序。 但是我绝对不准备进入任何超级高级的C或C ++,因为我所知道的只是Java。 任何帮助赞赏!

使用’if’语句检查后出现空指针exception

我收到一个非常烦人的错误,说我得到一个空指针exception但是有一个if语句在继续之前检查文本是否为null: public String[] getFileData() throws IOException { String file_name = “C:/Users/Liloka/Source/textfiles/Lines.txt”; try { ReadFile file = new ReadFile(file_name); aryLines = file.OpenFile(); for(int i =0; i<aryLines.length; i++) { System.out.println(aryLines[i]); } } catch(IOException e) { System.out.println(e.getMessage()); } return aryLines; } public void actionPerformed(ActionEvent evt) { if(evt.getSource() == enterBtn) { String Text = textToAdd.getText(); if(!(Text.equals(null))) { RF.addNewElement(Text); System.out.println(Text); […]

指针 – 减少内存消耗

我一直在为OpenGL练习编写Minecraft副本(我猜多少),但是在编写基本渲染API之后,我注意到真正的Minecraft使用了很多或内存 – 大约800MB! 我完全可以理解为什么这与它必须记住的所有块以及生成器的怪物和可能的地形数据…我问自己“这个块与那个块完全相同……它们可以在代码中吗? “ 并且记得C ++有指针,所以我试图在Java中做同样的事情我想到的唯一方法,创建每个块的一个静态实例而不使用new关键字,这是最好的方法吗? 它似乎肯定有帮助..如果可能的话,我仍然希望它更好吗? 这是有问题的课程.. public abstract class Block { public static DirtBlock Dirt = new DirtBlock(); public static GrassBlock Grass = new GrassBlock(); public static RedstoneOreBlock RedstoneOre = new RedstoneOreBlock(); public static TNTBlock TNT = new TNTBlock(); public static MonsterSpawnerBlock Monserspawner = new MonsterSpawnerBlock(); public static BedrockBlock Bedrock = new […]

如何复制二维字符串数组?

我正在使用一个使用二维数组字符串的程序(可能不是那么聪明,但是呃),我想编写一个函数来接受其中一个数组(比如说array1),make一个独立的副本,并返回它(比如说array2)。 但是,当我在array2中更改一个值时,它似乎反映在array1中。 我的function目前看起来像这样: public static String[][] copy(String[][] matrix, int n) { String[][] out = new String[n+1][n+1]; for (int i = 0; i < n+1; i++) for (int j = 0; j < n+1; j++) { if(matrix[i][j] != null) { String cp = new String(matrix[i][j]); out[i][j] = cp; } } return out; } 我声明了一个新的字符串数组,然后遍历它,分别复制每个值。 当这不起作用时,我甚至试图从每个旧字符串中明确声明一个新字符串并将其放入数组中。 谁能告诉我哪里出错了?

指向Java LinkedList节点的指针

我在O(1)处将n个条目推送到Java LinkedList 。 我想稍后在O(1)删除几个独特的项目。 我想保留一个带有“指针”的数组到LinkedList的唯一节点,以便我以后可以删除它们。 有没有办法在LinkedList或任何其他Java类上做到这一点? 我尝试将迭代器存储到项目中。 所以我可以使用iter.remove() 。 但我明白当时列表中只能有一个迭代器。 我知道一个简单的解决方案可能是我自己实现链接列表。 但我宁愿使用LinkedList或其他已经实现的Java类。