44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
1

Узнать размер объекта положив его в поток ввода вывода

18.02.2014, 21:16. Показов 2153. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На интервью встретил вопрос(в тесте).

Как узнать размер объекта. Все варианты ответа содержали код наподобие - кладём в поток и смотри сколько байт в потоке.

Можете пример показать? а то любопытно стало.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.02.2014, 21:16
Ответы с готовыми решениями:

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса...

Поток ввода-вывода
#include <iostream> using namespace std; int main() { int i; while(true) { ...

Форматирование поток ввода\вывода
Здравствуйте, прощу объяснить и помочь дописать небольшой кусочек программы. 3адание:...

Стандартный поток ввода и вывода в Objective-C
Я новичок в Objective-C. Мне необходимо ввести данные с клавиатуры в переменные а и b, а затем...

8
213 / 202 / 85
Регистрация: 09.05.2012
Сообщений: 494
18.02.2014, 21:33 2
Стандартных средств, таких как sizeof( ) в с/с++, для определения размера обьекта в Java нету.
А так можете почитать статейку и немножко понять, что к чему И вот это, пожалуй, тоже лишним не будет.
1
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
18.02.2014, 21:47  [ТС] 3
да я в курсе, что стандартных нет. но они кажись его сериализовали, пихая в поток и смотрели размер....что-то из этой области

Добавлено через 22 секунды
но что конкретно - хз
0
Эксперт Java
4092 / 3826 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
18.02.2014, 22:20 4
Цитата Сообщение от gredwhite Посмотреть сообщение
они кажись его сериализовали, пихая в поток и смотрели размер
Это неправильное решение. И полученное значение не будет иметь ничего общего с размером объекта в памяти.
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
19.02.2014, 10:30  [ТС] 5
а что это будет?
0
Эксперт Java
4092 / 3826 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
19.02.2014, 11:15 6
gredwhite, Это будет размер, который занимает сериализованный объект.
1
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
19.02.2014, 11:59 7
Цитата Сообщение от gredwhite Посмотреть сообщение
но они кажись его сериализовали, пихая в поток и смотрели размер....что-то из этой области
Это называется "смотрим в книгу - видим фигу". Вот тут есть пример упаковки полей при сериализации: . Там же приведены полученные объемы при сериализации одного и того же набора объектов разными способами. Как видите, объемы различаются.

Кроме того, сериализацию строк в зависимости от кодировки можно провести сильно по-разному. Один и тот же символ может занимать как один байт,так и четыре.

Кстати, строки в размер объекта входят или нет? В объекте на них только ссылки (4/8 байтов, в зависимости от битности VM, кстати, это тоже момент), а сами объекты в куче. А если это не строки, а другие объекты? Что считать размером объекта в памяти - только его собственную память, или все дерево по связям? При сериализации мы получим по умолчанию все дерево.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12477 / 7499 / 1757
Регистрация: 25.07.2009
Сообщений: 13,796
19.02.2014, 14:51 8
Цитата Сообщение от Skipy Посмотреть сообщение
смотрим в книгу - видим фигу
Похожая фига была в книге Брюса Экеля "Thinking in Java", правда, там речь шла как-раз о сериализации связанных объектов, а не с способе узнать, сколько они памяти занимают.
Попробовал сделать так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package easybudda.fakesizeof;
 
import java.io.*;
 
public class FakeSizeOf {
    public static void main(String[] args) throws IOException {
        Object[] arr = { new Boolean(true), new Character('ы'), new Integer(13), new Long(69L), new Double(3.14) };
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        ObjectOutputStream objOutStream = new ObjectOutputStream(outStream);
        
        for ( Object obj : arr ) {
            outStream.reset();
            objOutStream.writeObject(obj);
            objOutStream.flush();
            System.out.println(obj.getClass().getSimpleName() + ": " + outStream.size());
        }
        
        System.out.println("\nUsing predefined methods:");
        outStream.reset();
        objOutStream.write(13);
        objOutStream.flush();
        System.out.println("write with int as data: " + outStream.size());
        
        outStream.reset();
        objOutStream.writeBoolean(false);
        objOutStream.flush();
        System.out.println("writeBoolean: " + outStream.size());
        
        outStream.reset();
        objOutStream.writeByte(1);
        objOutStream.flush();
        System.out.println("writeByte: " + outStream.size());
        
        outStream.reset();
        objOutStream.writeChar('ы');
        objOutStream.flush();
        System.out.println("writeChar: " + outStream.size());
        
        outStream.reset();
        objOutStream.writeDouble(3.14);
        objOutStream.flush();
        System.out.println("writeDouble: " + outStream.size());
        
        outStream.reset();
        objOutStream.writeInt(13);
        objOutStream.flush();
        System.out.println("writeInt: " + outStream.size());
        
        outStream.reset();
        objOutStream.writeLong(69L);
        objOutStream.flush();
        System.out.println("writeLong: " + outStream.size());
    }
}
ерунда какая-то получилась
Код
Boolean: 43
Character: 46
Integer: 77
Long: 51
Double: 53

Using predefined methods:
write with int as data: 3
writeBoolean: 3
writeByte: 3
writeChar: 4
writeDouble: 10
writeInt: 6
writeLong: 10
Вообще как-то подозрительно на 2 байта больше выводится, что наводит на очевидный "хак" Но в принципе ересь это всё...
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
21.02.2014, 18:00  [ТС] 9
Цитата Сообщение от easybudda Посмотреть сообщение
Похожая фига была в книге Брюса Экеля "Thinking in Java", правда, там речь шла как-раз о сериализации связанных объектов, а не с способе узнать, сколько они памяти занимают.
Попробовал сделать так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package easybudda.fakesizeof;
 
import java.io.*;
 
public class FakeSizeOf {
    public static void main(String[] args) throws IOException {
        Object[] arr = { new Boolean(true), new Character('ы'), new Integer(13), new Long(69L), new Double(3.14) };
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        ObjectOutputStream objOutStream = new ObjectOutputStream(outStream);
        
        for ( Object obj : arr ) {
            outStream.reset();
            objOutStream.writeObject(obj);
            objOutStream.flush();
            System.out.println(obj.getClass().getSimpleName() + ": " + outStream.size());
        }
        
        System.out.println("\nUsing predefined methods:");
        outStream.reset();
        objOutStream.write(13);
        objOutStream.flush();
        System.out.println("write with int as data: " + outStream.size());
        
        outStream.reset();
        objOutStream.writeBoolean(false);
        objOutStream.flush();
        System.out.println("writeBoolean: " + outStream.size());
        
        outStream.reset();
        objOutStream.writeByte(1);
        objOutStream.flush();
        System.out.println("writeByte: " + outStream.size());
        
        outStream.reset();
        objOutStream.writeChar('ы');
        objOutStream.flush();
        System.out.println("writeChar: " + outStream.size());
        
        outStream.reset();
        objOutStream.writeDouble(3.14);
        objOutStream.flush();
        System.out.println("writeDouble: " + outStream.size());
        
        outStream.reset();
        objOutStream.writeInt(13);
        objOutStream.flush();
        System.out.println("writeInt: " + outStream.size());
        
        outStream.reset();
        objOutStream.writeLong(69L);
        objOutStream.flush();
        System.out.println("writeLong: " + outStream.size());
    }
}
ерунда какая-то получилась
Код
Boolean: 43
Character: 46
Integer: 77
Long: 51
Double: 53

Using predefined methods:
write with int as data: 3
writeBoolean: 3
writeByte: 3
writeChar: 4
writeDouble: 10
writeInt: 6
writeLong: 10
Вообще как-то подозрительно на 2 байта больше выводится, что наводит на очевидный "хак" Но в принципе ересь это всё...
На какой хак вас это наводит?

почему запись из массива выводит такие гигантские циферки?
0
21.02.2014, 18:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2014, 18:00
Помогаю со студенческими работами здесь

как записывать данные в поток ввода-вывода?
доброго времени суток, появилась "гениальная" идея, перехватить сообщения идущие в поток...

Перегрузить операторы ввода/вывода в поток (>>, <<) для класса
Помогите, перегрузить операции ввода/вывода в поток (&gt;&gt;, &lt;&lt;) для класса A. Для объекта класса A...

Как можно сделать виртуальный поток ввода / вывода?
есть программа, которая считает кол-во слов в строке причудливым способом, конечно можно сделать...

Что из себя представляет допустим поток ввода/вывода
Поясните пожалуйста что из себя представляет допустим поток ввода/вывода в С++ ? Это участок памяти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru